0

dbに保存する文字列をサニタイズしようとしています。私が取った最初のステップはを使用するaddslashes()ことでしたが、それでは多くのセキュリティ問題が解決されないことに気付いたので、を追加しましたhtmlspecialchars()。これで、次のコード行ができました。

$val=htmlspecialchars(addslashes(trim($val)));

しかし、私が間違っていなければ、後者は問題を引き起こす要素を「削除」するので、addslashes()によって処理される文字列で使用することはまったく意味があるのだろうかと思っていました。htmlspecialchars()

特に、それによってサーバーが実際に必要なく2回動作するのではないかと思いました。

4

2 に答える 2

9

あなたは一緒に間違っています。addslashes()はデータベースエスケープ機能ではありません。データベースアクセス拡張機能に付属しているものを使用してくださいmysqli_real_escape_string()

htmlspecialchars()ここでは完全に意味がありません。HTML内に文字列を配置する場合にのみ使用してください。これは、データベースに保存するときではなく、出力するときに使用する必要があります。

于 2012-11-01T12:39:09.813 に答える
1

文字列をデータベースに保存するときは、どちらも使用しません。

  • addslashes()引用符と円記号(\)のみをエスケープします。DBMSは、エスケープする必要のある他の特殊文字を使用する可能性があるため、SQLインジェクションを回避するには不十分です。SQLインジェクションを回避する最善の方法は、PHPデータオブジェクトとそのバインドパラメーターのサポートを使用することです。これにより、パラメーター値をSQL文字列から完全に除外できます。何らかの理由でPDOがオプションではない場合、たとえばmysqli_real_escape_stringMySQLを使用している場合は、少なくともデータベース固有のエスケープ関数を使用して、必要なすべての文字が確実にエスケープされるようにする必要があります。
  • htmlspecialchars()HTML以外の文字列をHTMLページに組み込むときに使用します。山かっこなど、Webブラウザにとって重要な文字をエスケープし、データベースとは関係ありません。完全なHTMLドキュメントを生成してデータベースに保存していないと仮定すると、値をデータベースに配置する前に、値に対してこの関数を呼び出すべきではありません。ユーザーが実際に入力した内容を保存し、データベースからhtmlspecialchars()値を取得して、実際にHTML出力に入れようとしているときに呼び出します。
于 2012-11-01T12:41:57.100 に答える