PHP でプリペアド ステートメントが必要であることを実証しようとしましたが、PHP はフォームを介して渡された文字列を使用して便利で奇妙なことを行うため、少し問題が発生しました。
私が「壊そうとしている」ステートメントは簡単です:
SELECT username FROM users WHERE username = '$username' AND password = '$password'
X' or TRUE;--
しかし、PHP は自動的に単一引用符をエスケープし、ステートメントを次のように変換するため、パスワードを渡すようなことは実際には機能しません。
SELECT username FROM users WHERE username = '$username' AND password = 'X\' or TRUE;--'
また、一重引用符がエスケープされているため、パスワードの等価性は損なわれません。このステートメントは安全と見なされますか? そうでない場合、どうすれば壊れますか?