2

入力ではなく出力で文字をエスケープするだけで十分であり、推奨されることさえあります。

get 変数はフォーム レベルからデータベースに挿入されないため、すべての get 変数に簡単に適用できます。

ただし、すべての投稿変数をどうするかはわかりません。データベースからのものではない場合、つまり生の入力データである場合は、完全にエスケープする必要があります。しかし、すべての変数をエスケープするために PDO の準備/実行を使用しています。今すぐ質問:

  1. select ステートメントと insert ステートメントの両方で PDO の準備/実行を使用しても問題ありませんか? 変数を2回エスケープしていませんか?
  2. PDO exeute ステートメントを使用して変数を取得したとしましょう。この変数をエスケープせずに $_POST['variable'] で表示しても問題ありませんか (PDO 関数で既に実行されている場合)。
  3. htmlspecialchars() は、データベースに由来しない GET 変数などをエスケープするのに十分ですか?

そして最も重要なことは、これらすべて、PDO の準備/実行、および htmlspecialchars() は、すべての XSS 攻撃を防ぐのに十分かということです。それとも私ももっとやるべきですか?もしそうなら、これは何ですか?入力からすべての html タグを削除しますか? 代わりに BB コードを使用しますか?

4

4 に答える 4

9

入力ではなく出力で文字をエスケープするだけで十分であり、推奨されることさえあります。

通常、次のことを行います。

  • 入力を検証し、準備済みステートメントを使用して保存します。プリペアド ステートメントは、データベースを SQL インジェクションから保護します。通常、入力時に HTML タグを取り除くことは望ましくありません。そうすると、データの整合性が失われる可能性があるためです。
  • ユーザー生成データ ( output ) を表示する場合、htmlentities と mb_convert_encoding を組み合わせて使用​​することで、XSS を防ぐことができます。

別の質問のhtmlspecialchars関数に関する注意:

HTML タグの外側で htmlspecialchars($string) を使用しても、マルチバイト文字セット攻撃ベクトルに対して脆弱です。

最も効果的な方法は、次のように mb_convert_encodinghtmlentitiesを組み合わせて使用​​することです。

$str = mb_convert_encoding($str, ‘UTF-8′, ‘UTF-8′);
$str = htmlentities($str, ENT_QUOTES, ‘UTF-8′);
于 2012-11-02T16:23:33.020 に答える
2

入力ではなく、出力のエスケープ文字

はい。

すべての get 変数に簡単に適用

ただし、 $_GET は定義による 入力です

変数を2回エスケープしていませんか?

いいえ - コンテンツをエスケープすることで、処理エージェントによる誤解からコンテンツを隔離しているだけです。データベースはエスケープされたデータを保存するのではなく、元のデータを保存します。

したがって、

O'Reilly

次に、エスケープしてSQL文字列にスプライスします....

O\'Reilly

次に、データベースに格納され、SELECT ステートメントによって取得される値は次のとおりです。

O'Reilly

HTML に出力したい場合は、それを htmlspecialchars() に渡して取得します。

O"Reilly

どこに行くかに応じてデータをエスケープするための適切な方法を使用します。したがって、データベースに何かを入れるときは mysql_real_escape() またはパラメーターバインディングなどを使用し、html に何かを入れるときhtmlspecialchars() を使用します。

于 2012-11-02T16:26:40.010 に答える
1
  1. データがユーザーから送信される場合は常に、データをサニタイズします(データベースに保存する場合は特に注意してください)。したがって、プリペアドステートメントを使用したPDOは必須です。他にあなたがすることは追加のボーナスです。

  2. はい(ここでは意見は人によって異なります)SQLインジェクションを防ぐためです(プリペアドステートメントを使用していると仮定します)。悪意のあるXSSコードに生データが含まれている可能性があるため、生データをデータベースに保存することをお勧めします。出力中は細心の注意を払ってください。

  3. いいえ。htmlpurifierを使用します(データベースから出力しているという観点から)。

于 2012-11-02T16:21:56.077 に答える
0

私は mysqli_real_escape_string と preg_replace を使用します

$email = mysqli_real_escape_string($dbc, trim($_POST['email']));
$password = mysqli_real_escape_string($dbc, trim($_POST['password']));
$domain = preg_replace('/^[a-zA-Z0-9][a-zA-Z0-9\._\-&!?=#]*@/', '', $email);

また、 PDOステートメントのエスケープ引数をエスケープするPDOに関する同様の投稿へのリンクは次のとおりです。

于 2012-11-02T16:20:16.400 に答える