-1

以下のコードは、1 つのチュートリアルから取得したものです。

 <?php
// user input that uses SQL Injection
$name_bad = "' OR 1'"; 

// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";

// display what the new query will look like, with injection
echo "Injection: " . $query_bad;

フロントエンドでは、次のように表示されます。

Injection: SELECT * FROM customers WHERE username = '' OR 1''

質問:

なぜそれが表示されusername = '' OR 1''ますか?

4

5 に答える 5

1

この画像の説明を参照してください。

ここに画像の説明を入力

于 2013-07-29T08:47:28.277 に答える
1

PHPでは、二重引用符で変数を記述すると、変数の値に置き換えられ、PHPによって完全に行われます

// user input that uses SQL Injection
$name_bad = "' OR 1'"; 

// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";

値 $name_bad を「OR 1」に置き換えると、次のようになります

SELECT * FROM customers WHERE username = '' OR 1'';

クエリの前後の余分な ' を削除する場合は、クエリを次のように記述します。

// our MySQL query builder, however, not a very safe one
$query_bad = "SELECT * FROM customers WHERE username = $name_bad";
于 2013-07-29T08:43:21.663 に答える
1

これは$name_bad、一重引用符が含まれているため、他の文字列の別の引用符セットの間に挿入したためです。

ベスト プラクティスとして、次を使用します。

$string = sprintf('SELECT * FROM customers WHERE username = \'%s\'', ' OR 1');

ただし、SQL については、サニタイズする必要があります。

PDO を使用している場合、bindParamメソッドは自動的に SQL インジェクションを防止します (それは述べています)。

http://www.php.net/manual/en/pdo.prepared-statements.php

于 2013-07-29T08:44:24.260 に答える