1

挿入ステートメントを準備するときに、二重引用符内で単一引用符を使用する必要がある理由について質問があります。私の理解では、二重引用符で変数が解釈されます。一重引用符を含む変数は解釈されません。

$var1 = 5; print "$var1"; //output value 5
$var2 = 'jason'; print '$var2'; //output $var2

以下のコードの値セクションで一重引用符が使用されている理由がわかりません。説明をお願いします。ありがとう!

$first_name = $_POST['first_name'];
$first_name = trim($first_name);
$last_name = $_POST['last_name'];

$stmt = $con->prepare("insert into reg_data (first_name, last_name) 
                       values('$first_name', '$last_name')");
4

5 に答える 5

4

引用符の使用法は正しいですが、準備されたステートメントを間違って使用しています - あなたのコードはSQL インジェクションに対して脆弱です! 代わりに、クエリでプレースホルダー (引用符なし) を使用し、例のように実際の値を後で渡します。

$first_name = $_POST['first_name'];
$first_name = trim($first_name);
$last_name = $_POST['last_name'];

$stmt = $con->prepare("insert into reg_data (first_name, last_name) 
                       values(:first_name, :last_name)");
$stmt->execute(array(':first_name' => $first_name, ':last_name' => $last_name));
于 2013-02-20T13:26:17.070 に答える
2

一重引用符は、文字通り SQL の一重引用符です。SQL は次のようになります。

insert into reg_data (first_name, last_name) values('bob', 'bobowitz')

SQL のリテラル値は、一重引用符で囲む必要があります。

于 2013-02-20T13:26:41.310 に答える
1

なぜ: 一重引用符は、次のような最終クエリを取得するために使用されます。

insert into reg_data (first_name, last_name) values('Bogdan', 'Burim')

一般的に悪い考えです。

SQL インジェクションが可能です。

于 2013-02-20T13:25:39.773 に答える
0

答えを述べた人は非常に技術的であり、クエリで一重引用符を使用するとSQLインジェクションをどのように誘うかについて非常に具体的な答えを与える可能性があります。しかし、なぜクエリで一重引用符を使用する必要があるのか​​と尋ねられたので、例を挙げて説明しようと思います。

静的な値を使用したクエリ:

insert into reg_data (first_name,last_name)values('fn_value','ln_value');

値が文字列であるため、mysqlのエラーが発生するかのように、値セクションから一重引用符を削除することはできません。したがって、変数を含む文字列値をdbに挿入するには、その変数を一重引用符で囲み、mysqlエラーを回避する必要があります。

于 2013-02-20T13:37:40.700 に答える
0

一重引用符は SQL ステートメントの区切り記号であり、PHP とは関係ありません。それらは、フィールドの値がどこで始まり、どこで終わるかを MySQL に伝えます。

このことを考慮:

SELECT * FROM mytable WHERE field=new order by name desc

クエリで where field= "new order by name desc" を制限する必要がありますか、それとも where field= "new" を制限してから "name" フィールドで降順で結果を並べ替える必要がありますか?

引用符はそれを明確にします:

SELECT * FROM mytable WHERE field='new order by name desc'

さらに: これが、MySQL で値をエスケープする必要がある理由です。ユーザーが' OR 1 = 1; --ユーザー名フィールドに入力し、認証のクエリが次の場合:

SELECT * FROM users WHERE username = '$_POST['username']' AND password = '$_POST['password']'

最終的には次のようになります。

SELECT * FROM users WHERE username = '' OR 1 = 1 -- ' AND password = 'asfd'

これは有効な SQL であり、テーブル内のすべてのユーザーを選択します (からの入力$_POST['username']により、残りのクエリがコメント化されているためです。ただし、値を適切にエスケープすると、次のようになります。

SELECT * FROM users WHERE username = '\' OR 1 = 1 -- ' AND password = 'asfd'

usernameこれは、MySQL が=\' OR 1 = 1 --と一致するパスワードを持つユーザーを探すことを意味します。シンプルなmysqli_real_escape_stringでエスケープできますが、PDO とパラメーター化されたクエリは常に推奨されます。

Web アプリケーションでデータベースを操作する前に、PDO、パラメーター、および SQL インジェクションに関するいくつかのチュートリアルを読むことを強くお勧めします。後で感謝します。

于 2013-02-20T13:26:53.590 に答える