1

サニタイズとエスケープについてすでに質問したことは知っていますが、回答が得られなかった質問があります。

よし、ここまでだ。私がPHPスクリプトを持っていてGET、ユーザーがそれをmySQLデータベースから入力した場合、エスケープせSELECTず、いずれかを使用して、またはHTMLタグを許可した場合、セキュリティ上のリスクは問題になりますかデータベースから選択/検索? 入力は、および(\%_) を使用して既にサニタイズされているためです。<>htmlspecialcharshtmlentitiesstrip_tagstrim()mysql_real_escape_stringaddcslashes

使用上の問題htmlspecialcharsは、ユーザー入力が許可するはずのアンパサンド (&) をエスケープすることです ( htmlentities? についても同じことが言えると思います)。を使用すると、" Johnstrip_tags " のようなものによって、PHP スクリプトが John の結果を選択して表示することになりますが、これは想定されていません。

データベースから選択する前に、入力をサニタイズするための私のPHPコードは次のとおりです。

if(isset($_GET['query'])) {
  if(strlen(trim($_GET['query'])) >= 3) {
      $search = mysql_real_escape_string(addcslashes(trim($_GET['search']), '\%_'));
      $sql = "SELECT name, age, address WHERE name LIKE '%".$search."%'";
      [...]
  }
}

そして、「x が y の結果に一致しました。」を表示するための私の出力は次のとおりです。

echo htmlspecialchars(strip_tags($_GET['search']), ENT_QUOTES, 'UTF-8')." matched y results.";
4

2 に答える 2

1

ここには、あなたが特定した 2 つの異なる懸念事項があります。

SQL ステートメントのユーザー データ

クエリを作成するときは常に、任意のユーザー データがクエリに含まれないようにする必要があります。これらの誤りはSQL インジェクション バグと呼ばれ、データを正しくエスケープできなかった結果です。原則として、文字列連結を使用してクエリを作成することは絶対にしないでください。可能な限りプレースホルダーを使用して、データが正しくエスケープされるようにしてください。

HTML ドキュメント内のユーザー データ

ユーザーが送信したコンテンツを含むページをレンダリングする場合、ユーザーが任意の HTML タグやスクリプト要素を導入できないように、コンテンツをエスケープする必要があります。これにより、 XSS の問題が回避され、文字のような文字が正しく解釈されなくなります&<"x < y" のユーザー データがページを壊すことはありません。

ユーザーデータをレンダリングするコンテキストが何であれ、常にエスケープする必要があります。スクリプト タグ内や URL 内など、他にもありますが、これらは最も一般的な 2 つのタグです。

于 2013-04-23T16:04:43.093 に答える