一重引用符は 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 インジェクションに関するいくつかのチュートリアルを読むことを強くお勧めします。後で感謝します。