-2

以下のコードは、MySQL データベースでの SQL インジェクションの防止に優れていますmysqli_real_escape_stringか?

$str = "SELECT * FROM customers WHERE username = '; DELETE FROM customers WHERE 1 or username = '";
$str2 = "";

for($i = 0; $i < strlen($str); $i++)
{
    if (strpos ("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ,.?!0123456789", $str[$i], 0) !== FALSE)
    {
        $str2 = $str2 . $str[$i];
    }
}

echo "$str2";
4

3 に答える 3

9

SQL インジェクションを回避しようとするときに、ホワイトリスト/ブラックリストを使用する理由はまったくありません。mysqli_プリペアド ステートメントを使用せずに関数を使用する場合に必要なことは、でデータを処理することだけmysqli_real_escape_string()です。

ただし、代わりに準備済みステートメントについて学習する方がよいでしょう。彼らは逃げるよりもクリーンで安全です。

準備済みステートメントを使用してサンプル クエリを実行するコードは、次のようになります。

$stmt = $conn->prepare('SELECT * FROM customers WHERE username = ?');
$stmt->bind_param('s', $username);
$result = $stmt->execute();

あなたは例を理解していないので、ここに詳細な説明があります:

  • 行 1 はステートメントを準備します。?外部データを使用する場合はいつでも使用します。
  • s2 行目は、最初のプレースホルダーの文字列 ( ) パラメーターをバインドします。したがって$username、(信頼できない)値を含める必要があります
  • 行 3 は、以前にバインドされたパラメーターを使用してステートメントを実行します。SQL とデータは別々に転送されるため、SQL インジェクションのリスクはありません。
于 2013-01-20T14:02:02.207 に答える
2

以下のコードは mysqli_real_escape_string よりも mysql インジェクションを防ぐのに優れていますか、それとも問題ではありませんか?

ない。それはもっと悪いことであり、あなたはそれをすべきではありません!エスケープ(!)データ(!!)の代わりに、クエリ全体を壊しています。

要するに、それは

  1. 有効なクエリが機能しないようにする
  2. 悪意のあるクエリを防止しない

クエリ全体ではなく、データのみにメソッドを適用しても、

  1. データをいじる
  2. すべての種類の SQL インジェクションを防ぐわけではありません
于 2013-01-20T14:12:59.997 に答える
1

この記事を読んでください。ユーザーのコメントがある下部には、SQL インジェクションを防止するための便利なトリックやヒントがたくさんあります。ただし、最初のステップは、クエリに挿入する前に、GET/POST データを検証してサニタイズすることです。

于 2013-01-20T14:06:42.557 に答える