2

私のサーバーでは、magic_quotes がオフになっています。ユーザーがフォームからコンテンツを記事としてDBに保存するとき、私は使用します

$text = mysql_real_escape_string($_POST['text']);SQL インジェクションを防止します。

これは私の入力<img src="image.png"></img> であり、これがDBに保存されているものです<img src="image.png"></img>

echo htmlentities($row['text']);画面に<img src="image.png"></img>印刷されると、ソースを表示すると&lt;img src=&quot;image.png&quot;&gt;&lt;/img&gt;.

私の質問は

  1. <img src=\"image.png\"></img>SQL インジェクションを防ぐために、DB に保存する必要はありませんか?
  2. htmlentitiesXSS 攻撃を防ぐ良い候補はありますか?
  3. magic_quotes をオンにする必要がありますか?
4

4 に答える 4

2

<img src=\"image.png\"></img>SQL インジェクションを防ぐために、DB に保存する必要はありませんか?

いいえ、SQL インジェクションは広く誤解されています。主な理由は、SQL インジェクションは単なる文字列操作であるため、実際には SQL とは何の関係もないからです。データベースに挿入するデータを変更する必要はありません。クエリとしてデータベース サーバーに送信する文字列を変更するだけで済みます (賢明な選択をして、クエリ文字列をエスケープする代わりに準備済みステートメントを使用しない限り)。保存されたデータは、元の状態である必要があります。

htmlentities は XSS 攻撃を防ぐ良い候補ですか?

はい。ただしhtmlentities()、データをデータベースに保存するのではなく、ブラウザーに出力として送信するのに適しています (DB からのデータは Web ページ以外に使用される可能性があるため)。

magic_quotes をオンにする必要がありますか?

いいえ、準備済みステートメントを使用する必要があります。

于 2011-08-25T20:29:30.350 に答える
0

mysql_real_escape_string を使用して、引用符を通常に戻します。

$text = str_replace('\"', '"', $row['text']); // Alternative one
$text = preg_replace("/X/", '"', $row['text']); // Alternative two. X needs to be \\", \\\" or \\\\", perhaps \\\\\"

更新された質問への回答:

データの正しい保存は次のようになります。

入力 -> php -> mysql_real_escape_string -> db -> php -> htmlspecialchars -> ブラウザ

于 2011-08-25T19:56:30.620 に答える
0
  1. 魔法の引用符が有効になっているようです。チェックしてください。
  2. これに関する記事はたくさんありますが、すぐに始められるように、javascript と外部画像の使用を許可しないでください。
于 2011-08-25T19:56:45.677 に答える
0

エスケープされたデータをデータベースから取得すると、二重にエスケープされたことが示唆されます。PHP はmagic_quotes_gpcオンになっていますか? HTML をサニタイズして、指定した特定の構造のみを許可する場合は、必要に応じて厳密または緩くなる HTMLPurifierを使用することをお勧めします。

于 2011-08-25T19:58:20.740 に答える