ユーザーにいくつかの情報(名前、生年月日など)を入力させました。次に、これらの値をデータベースに挿入する必要があります。mysql_real_escape_string()
mysql インジェクションを防ぎ、html タグを処理するために使用htmlspecialchars()
する必要がありますか? 両方が必要ですか、それともどちらかが必要ですか?
そのうちの1つだけを使用する必要がある場合、どれを使用しますか? 両方を使用する必要がある場合、どちらが最初でどちらが最後ですか?
ユーザーにいくつかの情報(名前、生年月日など)を入力させました。次に、これらの値をデータベースに挿入する必要があります。mysql_real_escape_string()
mysql インジェクションを防ぎ、html タグを処理するために使用htmlspecialchars()
する必要がありますか? 両方が必要ですか、それともどちらかが必要ですか?
そのうちの1つだけを使用する必要がある場合、どれを使用しますか? 両方を使用する必要がある場合、どちらが最初でどちらが最後ですか?
mysql インジェクションを防ぐために mysql_real_escape_string を使用する必要がありますか?
いいえ。プリペアド ステートメントとパラメーター化されたクエリを使用します。mysql_*
これには、古いライブラリの使用をやめて、より新しいもの (PDO など)を使用する必要があります。
html タグを処理するための htmlspecialchars の両方またはいずれかで作業を行うことができますか?
データを HTML ドキュメントに挿入するときに、XSS 攻撃htmlspecialchars
から保護するために使用します。データベースは HTML ドキュメントではありません。(後でデータベースからデータを取り出して HTML ドキュメントに入れる場合があります。そのときは、 を使用します)。htmlspecialchars
いいえmysql_real_escape_string()
!PDOを使用する必要があります。MySQL には最初にパラメータ化されていない SQL が与えられ、次にプラグインするデータが与えられるため、インジェクション攻撃に対して脆弱ではない準備済みステートメントを使用します。
例えば:
$dbh = new PDO();
$stmt = $dbh->prepare('INSERT INTO data (something) VALUE(:userInput)');
// No mysql_real_escape_string necessary
$stmt->execute(array(
':userInput' => $_POST['userInput']
));
htmlspecialchars()
すべての入力で使用すべきではありませんが、使用する必要があります! 通常、データベースからデータが取得された後に適用されますが (ただし、後で忘れられた場合に備えて、事前に適用することをお勧めします)、HTML ページにエコーするユーザー入力に役立ちます。<script>
悪意のあるユーザーが悪意のあるコードを含むタグをサイトの入力フィールドに追加できる XSS (クロス サイト スクリプティング) 攻撃からユーザーを保護します。この悪意のあるユーザーが投稿したページに他のユーザーがアクセスすると、そのユーザーのブラウザーは悪意のあるスクリプトを解釈し、セッション ID を盗んだり、CSRF (クロス サイト リクエスト フォージェリ) を試みたりする可能性があります。
結論: ユーザー コンテンツをページにエコーする前に使用する必要があります。そのコンテンツが厳密なフィルター (mm/dd/yy のみを受け入れる生年月日など) によって検証されていない限り。よくわからない場合は、とにかく使用してください。痛くないです。それは助けになるだけです!
参考文献: