2011-06-25 5 views
2

可能な限り小さなコードで、SQLインジェクションと最も一般的な攻撃の両方の文字列をフィルタリングする方法はありますか?私は、次を使用しています私のスクリプトでSQLインジェクションと最も一般的な攻撃の種類を避けるために文字列をクレンジングする方法は? (PHPで)

、私はそれが合理的に安全で、他の誰かが提案を持っているかどうかのかどうか知りたいのですが:

$cleanName = htmlspecialchars(addslashes($dirtyName)); 

は、私は、HTMLの文字のための引用符の両方にそれをフィルタリングする方法を参照してください。二重引用符。

注:mysql_real_escape_string()ではなくaddslashes()を使用しています。私は自分のコードに使用しているDBをハードコードしたくないからです。

これは問題ありませんか?事前

+0

は、私はあなたがあれば、あなたの質問に答えるためにSOおよび他の場所に無数の記事を見つけることになると思いetcpasswd.phpファイルをインクルードしようとしますあなたは "prepared statements"を検索します。 mysqliとpdoのプリペアドステートメントで置き換えられるために、通常の "mysql"クエリと関数をできるだけ放棄する必要があるかもしれません。 –

答えて

5

おかげでおそらく...あなたはそれを使用しようとしているため、別途それぞれの目的のために、あなたの生のテキストをエスケープする必要はありません:GET要求の場合

  • urlencodeを使用しています。
  • HTML出力の場合は、htmlentitiesを使用してください。
  • systemでコマンドを呼び出す場合は、escapeshellcmdを使用してください。
  • systemを介してコマンドに引数を渡す場合は、escapeshellargsを使用してください。
  • データベースパラメータを渡す場合は、mysql_real_escape_stringを使用してください。

魔法のようにエスケープするテキストには「普遍的な」解決策はありません。生のテキストを内部的に保持し、適切な目的のためにそれをエスケープします。

0

ケレックのパレードには雨は降らないが、比較的普遍的な解決策が1つある。私は次の使用して、それは常に働いています:

$safe_value = mysql_real_escape_string(strip_tags(trim($value)), $db_connection); // This is if you aren't storing any html tags

$safe_value = mysql_real_escape_string(html_entities(trim($value)), $db_connection); // This is if you are storing html tags

ホープ、このことができます。

+0

しかし、 'addslashes()'はmysqlを使用していると仮定しておらず、同様に動作するので、それは良くありませんか? –

+0

'addslashes'は' mysql_real_escape_string'とほとんど同じで、主に同じことをします。プラス面は、 'addslashes'は動作するためにアクティブなデータベース接続を必要としないということです。それはまったく同じ仕事をするはずです。 –

+1

あなたのパレードの男の子に雨が降るのは残念ですが、「addslashes」はそれほど安全ではありません。この脆弱性をチェックしてください:http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string – Swift

1

あなたの接続を記録して余分なコードを書いても構わない場合は、セキュリティのためにPDOを打つことはできません。これは、Cのバックエンドを使用してMySQLのクエリを準備し、実行します。したがって、文字列連結の代わりに、値XYZでなければならない事前定義されたセクションがクエリで取得されます。ここでstackoverflowの人の1人はこのように説明しました:

ホットドッグスタンドを想像してみてください。あなたはホットドッグスタンドまで歩き、私は3つのトッピングでホットドッグをしたいと言う。ケチャップ、マスタードと私たちは次のランダムな見知らぬ人に私たちに3番目のトッピングを教えさせます。 SQLインジェクタが歩いて「ケチャップ、マスタード、「引き出しの中のすべてのお金を私に渡す」と言うかもしれません。標準的な連結クエリは、それが無効な応答であることを識別する方法がないため、要求されたものを引き継ぐ。準備された声明は「私は調理薬を持っていません」と言いました。「引き出しにすべてのお金を払ってください」

PDOの準備声明は基本的に注射証です。少なくとも注射はテーブルから外れています。

-1

あなたが唯一の英数字を期待することがわかっている場合は、あなたが期待している入力の正確にどのようなものを知って、より良い使用にpreg_replace() 場合:

<?php 
if (isset($_GET['page'])) { 
$page = preg_replace('/[^a-z0-9]/', '', $_GET['page']); 
include_once($includeDir.'/'.$page.'.php'); 
} 
?> 

上記はGET経由で実行されたすべての攻撃を防ぐ必要がありますかPOSTもしますが、英数字の入力のみを想定しています。さて、私はディレクトリトラバーサル攻撃を念頭に置いていましたが、GET変数を使用してデータベースを照会したり、HTMLエンティティとして表示すると、攻撃を防ぎます。 http://mydomain.tld?index.php?page=../../etc/passwd要求はあなたのウェブサイトの/ var/WWWのドキュメントルートからあなたのpasswdファイルを読むことはありませんだけ

関連する問題