私は通常、次のようにしてユーザー入力をエスケープします。
htmlspecialchars($str,ENT_QUOTES,"UTF-8");
またmysql_real_escape_string($str)
、mysql接続が利用可能な場合はいつでも。
これをどのように改善できますか?今のところ問題はありませんが、よくわかりません。
ありがとうございました。
私は通常、次のようにしてユーザー入力をエスケープします。
htmlspecialchars($str,ENT_QUOTES,"UTF-8");
またmysql_real_escape_string($str)
、mysql接続が利用可能な場合はいつでも。
これをどのように改善できますか?今のところ問題はありませんが、よくわかりません。
ありがとうございました。
データは保存用にエスケープ (サニタイズ) し、表示用にエンコードする必要があります。データは、ストレージ用にエンコードしないでください。生データのみを保存したい。エスケープ文字は保存されないため、エスケープしても生データはまったく変更されないことに注意してください。これらは、生データとコマンド構文の違いを適切に知らせるためにのみ使用されます。
つまり、次のことを行います。
$data = $_POST['raw data'];
//Shorthand used; you all know what a query looks like.
mysql_query("INSERT " . mysql_real_escape_string($data));
$show = mysql_query("SELECT ...");
echo htmlentities($show);
// Note that htmlentities() is usually overzealous.
// htmlspecialchars() is enough the majority of the time.
// You also don't have to use ENT_QUOTES unless you are using single
// quotes to delimit input (or someone please correct me on this).
マジック クォートが有効になっている場合は、ユーザー入力からスラッシュを削除する必要がある場合もあります。 stripslashes()
で十分です。
ストレージ用にエンコードしてはならない理由については、次の例をご覧ください。
である DB フィールドがあるとしchar(5)
ます。html 入力もmaxlength="5"
. ユーザーが「&&&&&」を入力すると、これは完全に有効である可能性があり、「&&」として保存されます。取得してユーザーに表示するときに、エンコードしないと「&&」と表示されますが、これは正しくありません。エンコードすると、「&&」が表示されますが、これも正しくありません。ユーザーが保存しようとしていたデータを保存していません。生データを保存する必要があります。
これは、ユーザーが特殊文字を保存したい場合にも問題になります。これらの保管はどのようにしていますか?あなたはそうしない。生のまま保存してください。
SQL インジェクションを防ぐには、少なくとも で入力をエスケープしますがmysql_real_escape_string
、PDO のような DB ラッパーで準備済みステートメントを使用することをお勧めします。どちらが最適かを判断するか、自分で作成してください (そして徹底的にテストしてください)。
XSS (クロスサイトスクリプティング) から防御するには、ユーザー入力をエンコードしてから表示するようにします。
データベースを PDO に切り替えます。それははるかに簡単で、エスケープを行います。
mysql_real_escape_string($str)
SQL インジェクションを回避するためだけに使用する場合は、クエリ内で常に一重引用符を追加してください。
画面への安全でない出力を解析する場合、htmlspecialchars は問題ありません。