2012-04-12 11 views
2

私はPDOをユーザーの入力に使用していますが、今はMySQLデータベースのコンテンツを表示するときにPDOを使用していません(SQLコマンドでは古い方法です)。PHP PDOを使用しているときにユーザー入力と出力をサニタイズ/フィルタリングする必要がありますか?

MySQLデータベースにデータを挿入するときにユーザーからの入力をフィルタリングする必要がありますか?

出力を消毒する方法がある場合は、出力をサニタイズする最良の方法は何ですか? htmlspecialchars()を使うだけでいいですか、それともstrip_tags()などを使う必要がありますか?

私はプレースホルダと準備文を使用しています。

ありがとうございます。

答えて

6

あなたは、ここでは異なる消毒が混乱している:

  • あなたのDBに挿入するデータのsanatizing SQLを。 paramsを使用して準備されたクエリを使用して、エスケープする必要はなく、PDOは内部的に行います。準備されたクエリを使用しない場合は、それらを使用します。それは弾丸ではない(私が知る限り)。

  • あなたがHTMLとしてあなたのDBと出力から取得したデータ:、どちらかあなたが脱出したいか、何によって、htmlspecialchars()htmlentites()またはstrip_tags()を使用して、ここでは、あなたのユーザーにそれを印刷する前に、sanatizeしなければならない(防ぐためにXSS)削除する。

+0

文字列をエスケープして100%安全なものにしたい場合 – 2by

+1

これらの関数はそれぞれ安全ですが、必要なものを使用してください: 'strip_tags'はHTMLコードを取り除きます。反対に' htmlspecialchars'それらは(まだ彼らはdispayedされますが、ブラウザによって解釈されません)。 'htmlentities'はàéèのような文字もエンコードします。あなたのアプリケーションがUTF-8で動いているならば、単に 'htmlspecialchars'を使ってください。 を参照してください。http://stackoverflow.com/questions/7232793/should-i-use-both-striptags-and-htmlspecialchars-to-prevent-xss – Claaker

+0

htmlspecialchars()の代わりにhtmlentities()を使用してください。 –

5

パラメータ化されたクエリを正しく使用している場合は、エスケープする必要はありません。それは実際にエスケープされたデータをデータベースに挿入するので、データを選択したときにエスケープが戻ってくることになります。

ただし、PDOに切り替えるだけでNOTコードを安全にすることができます。あなたがしている場合

$sth = $db->prepare("INSERT INTO sometable (x) VALUES ($_GET[x])"); 

プレースホルダを使用していないので、まだ注入攻撃に対して完全に脆弱です。

+0

プレースホルダとプリペアドステートメントを使用しています。 – 2by

関連する問題