2010-12-13 11 views
2

これは私が実際には得られないものの1つです。ユーザーが送信したデータをエスケープすることが非常に重要だと私は知っています。プロセスの「不良」データを許可しないようにするには、stripslashes()(バックスラッシュを削除する)、strip_tags(HTMLとPHPタグを削除)、htmlSpecialChars(たとえば、&を&に変更)、正規表現を使用する方法があります。ユーザーからのエスケープはデータを送信しましたか?

使用方法、使用方法、使用する理由は?

+0

[PHP $ _POST \ [\] input? ://stackoverflow.com/questions/2401706/where-to-sanitize-php-post-input) – ajreal

+0

「不良データ」はありません。 –

+0

それは悪いデータではなく「悪いデータ」です。 = P – daGrevis

答えて

2

たとえば、$_POST['album_name']というコンテンツを手に入れてページに貼り付けると、誰かがHTMLとJavaScriptを送信してページの一部となり、サイトがハッキングされる可能性があります。

$_POST['album_name']の内容をSQLクエリに入れることができます。しかし、ユーザーは今実行している独自のSQLクエリを作成し、データベースがハッキングされるようになりました。

http://xkcd.com/327/

1

この質問は非常に広いです。それは本当にあなたがデータをエスケープしているものに依存します。

例では、stripslashesstrip_tagsを使用すると、Webブラウザに表示されるデータをエスケープするのに適しています。しかし、それはデータベースのクエリには良いことではありません。

一方、データベースエスケープメカニズムは、ユーザーデータをデータベースエンジンに送信する場合に適していますが、XSS攻撃を防止しようとするとうまくいかない場合があります。

各エスケープ機能には、使用する必要のある特定のコンテキストがあります。

1

ところで、PHPでユーザ入力データをフィルタするベストプラクティスはfilter_inputです。

例:

$userId = filter_input(INPUT_GET, 'user_id', FILTER_SANITIZE_NUMBER_INT); 
$username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_SPECIAL_CHARS); 
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); 

その他のフィルターhere定数。

+0

私はあなたの考えに一種同意しますが、私は使用される方法に同意しません。 'filter_input'は' filter_var'と同じですが、入力ストリームに対して直接作用します。このため、後で単体テストが難しくなります。 [this guy try](http://stackoverflow.com/questions/4158307/how-to-make-a-phpunit-test-that-depends-on-real-post-get-data)のように。 – netcoder

+0

問題:PHP 5> = 5.2.0。 – daGrevis

+0

PHPUnitテストユニットのケースのみ。 Webケースのテストには、Seleniumが良い選択です。 – joksnet

0

データがデータベースに格納されている場合、ユーザーが通常のクエリから逃げ出してそのクエリを中断または変更するデータを送信しないようにする必要があります。パラメータバインディングでMySQLiを使用することは、データベースを保護する現在の最良の方法です。あなたが文字列を使うかpregも置き換えている限り。したがって、整数IDがintになるように保証されています。あなたは論理的にあなたのデータからできるだけ多くの文字を削除したい。

データがタグ間に配置される場合は、strip_tagsに続けてhtmlentitiesを指定するとよいでしょう。ただし、ホワイトリストを使用することができます。出力がintであることがわかっている場合は、それが正しいことを確認してください。 echo htmlentities(strip_tags($value));

このデータをタグ<a href='<?php echo $value; ?>'>の中に入れると、上記のデータでは不十分です。また、一重引用符を置き換える必要があります。ここでは、中毒データの作成を防ぐことがさらに重要です。$ valueが' onClick='alert("oops");'のようなものだった場合は、深刻なバインドを行う可能性があります。ここでは、絶対にホワイトリストを使用する必要があります。絶対に必要な場合は、ユーザーが入力したコンテンツのみをここに表示することができます。

JavaScriptに出力したい場合。しないでください。何年もセキュリティで働いていたとしても、これを実行すべきではありません。しかしながら。 1つの例外は、VERY固有の値に対して行うことができます。整数。 A-ZA-Z0-9にロックされている文字列と、置き換え前のスペース。しかしながら。これは非常に危険で、システムを深刻に危険にさらす可能性があります。

変数をevalまたはexecの中に入れる場合は、ただしないでください。あなたは攻撃を防ぐほどスマートではありません。私は誰もいません。誰かが方法を見つけ出すのは時間の問題です。そして、最初に書かれたコードがうまくいけば?後日、コードが変更され、もう正常ではありません。ただしないでください。期間。または、ある日あなたは自分自身に不思議に思っている刑務所に座っているでしょうが、 "しかし、私は五角形にハックしませんでした..."

関連する問題