現在、を使用してhtmlspecialchars(mysql_escape_string($value))
いますが、ネストされたステートメントではなく、1つのステートメントでサニタイズする方法はありますか?
2 に答える
さて、それらの両方を処理する1つの関数はありません。プリペアドステートメントとhtmlpuffierクラスを使用できます。そうすれば、「ルックアンドフィール」が少し良くなるでしょう:)
mysql_real_escape_string
最近、実際に支持を失っています。
現在、PDO
またはを使用することが推奨されていますmysqli
。どちらもデフォルトでPHPに付属しています。parameterized queries
SQLコマンドを自分で作成するのではなく、呼び出されたものを使用してデータベースにアクセスします。これは、クエリと変数が別々に関数に渡されるため、エスケープについて心配する必要がないことを意味します。
PDOの詳細については、http: //net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/をご覧ください。
関連する注記として、を使用するのではなく、ユーザーが入力した入力を「作成されたとおりに」データベースに格納するのが一般的ですhtmlspecialchars
。次に、サイトのどこに表示されていても、を使用htmlspecialchars
してデータをエスケープする必要があります。これはOWASPが推奨する規則です。
これは、コンテキストに応じてさまざまなものをエスケープする必要があるためです。この文字列:
' <script src="http://example.org/malice.js"></script> ]}\\\\--
... JSON
(引用符と円記号をエスケープ]
する}
必要がある)、HTML
(引用符と<
sをエスケープする必要がある)、またはURL
(ほとんどすべてがエスケープされます)。JavaScriptにHTMLのエンコードを解除するように指示するのに時間を費やす必要がある場合、コードはすぐに混乱します。
このアプローチにより、バグの修正も簡単になります。コンテンツが1つのページで適切にエスケープされないバグがサイトにある場合は、ページを更新してすべてを修正できます。データがデータベースに誤って保存されるというバグがサイトにある場合は、データベース内のすべてを修正する必要があります(これにははるかに時間がかかり、より多くのユーザーに害を及ぼします)。