1

SQL インジェクション攻撃を回避するために、Web サイトのユーザーが入力したすべてのテキスト (およびその他のほとんどのデータ) をデータベースに送信して保存する前にクレンジングすることを検討しています。

関数が悪意のある可能性のあるすべての文字 ( \n 、 ' 、 " など) の前にバックスラッシュ ( \ ) を挿入し、返された文字列に新しく追加されたバックスラッシュが含まれていることを期待していたという印象を受けました。

このような悪意のある可能性のある文字を含む作成された文字列に対して簡単なテストを実行し、それをドキュメントにエコーしたところ、まさに期待どおりの結果が得られました。これらの文字をバックスラッシュでエスケープした文字列です。

そこで、データベースに格納する前に、データにクレンジング機能を追加しました。データストレージ用に作成したクエリに (mysqli_real_escape_string( $link , $string)) を挿入しました。スクリプトをテストしたところ、データベースに保存されているデータにバックスラッシュが含まれていないように見えて驚きました (少し残念でした)。テストしてテストしてテストしましたが、すべて役に立たず、途方に暮れています...

助言がありますか?何か不足していますか?その後、stripslashes($string) 関数でバックスラッシュを削除する必要があると予想していましたが、削除するものはないようです...

4

3 に答える 3

1

挿入が成功した後にデータベースでデータを表示するとmysql_real_escape_string()、でエスケープして、データベースにバックスラッシュが表示されません。これは、バックスラッシュのエスケープが SQL クエリ ステートメントでのみ必要になるためです。 mysql_real_escape_string()挿入(または更新、またはその他のクエリ入力)のためにサニタイズしますが、保存時にデータの完全に変更されたバージョンにはなりません。

一般に、変更またはサニタイズされたデータをデータベースに保存するのではなく、データを元のバージョンで保存する必要があります。たとえば、PHP の でエンコードされた HTML を保存するのではなく、完全な HTML 文字列を保存することをお勧めしますhtmlspecialchars()

stripslashes()データベースから取得する場合、他の同様のエスケープ解除は必要ありません。引用符で囲まれた文字列にバックスラッシュを自動的に追加することでプログラマー自身を保護するように設計されたPHP のレガシー (誤った) 機能がいくつかありmagic_quotes_gpc、出力で `stripslashes() を使用する必要がありますが、これらの機能は推奨されておらず、現在はほとんど削除されています。 .

于 2012-05-02T02:35:45.887 に答える
0

Web サイトのユーザーが入力したすべてのテキスト (およびその他のほとんどのデータ) をクレンジングしたいと考えています。

これはあなたが間違っていることです。

  1. mysqli_real_escape_string は何も「クレンジング」しません。その名前に「クレンジング」という言葉はありません。
  2. データを「クレンジング」するのではなく、フォーマットする必要があります。また、異なるデータには異なるフォーマットが必要です。
  3. 私のウェブサイトのユーザーが入力したデータだけでなく、すべてのデータをフォーマットする必要があります

現在の形式では、サイトを攻撃やエラーに対して非常に脆弱なままにしています。

この関数は、悪意のある可能性のあるすべての文字 ( \n 、 ' 、 " など) の前にバックスラッシュ ( \ ) を挿入したという印象を受けました。

お知らせするために、どのキャラクターにも悪意はありません。一部の状況で誤解される可能性のあるサービス文字がいくつかあります。
ただし、バックスラッシュを追加しても、データが自動的に「安全」になるわけではありません。一部のインジェクションでは、特殊文字は必要ありません。したがって、魔法のように安全にする何らかの魔法を使用するだけでなく、データを適切にフォーマットする必要があります

于 2012-05-02T07:01:11.063 に答える