SQLインジェクションは、悪意を持って形成されたSQLクエリであり、SQLデータベースを「混乱」させて、本来あるべきではないものを提供するために使用されます。たとえば、次のクエリについて考えてみます
"SELECT * FROM `users` WHERE `username` = '$name'";
通常の場合、これは機能します。これに「Jack」を送信すると、Jackという名前のすべてのユーザーが返されます。ただし、ユーザーが「'OR 1 =1」と入力すると、結果のクエリは次のようになります
"SELECT * FROM `users` WHERE `username` = '' OR 1=1";
1は常に1に等しく、結合句はORであるため、これはすべての行でtrueを返し、悪意のあるユーザーにすべての行を表示します。この手法を使用すると、誰かがデータベース全体を表示できます。また、誰かが「'; DROP TABLE users
」のようなものを送信するかどうかも検討してください。 ";-、結果は
"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";
これは2つのクエリで、1つは何も実行せず、もう1つはユーザーデータベース全体を削除してデータを失います。
SQLインジェクションを防ぐ最善の方法は、プリペアドステートメントを使用することです。これらを使用して、SQLデータベースに次のようなクエリを送信します
"SELECT * FROM `users` WHERE `username` = '?'";
これにより、データベースはクエリの形式を知ることができるため(ユーザー名が値と等しい場合)、プレーンテキストクエリが与えられても混乱することはありません。次に、データベースは1つの値を期待し、それをどこに配置するかを認識します。次に、その値をデータベースに渡して、検索に使用できるようにします。データベースがクエリを最適化して検索を高速化できるため、これも優れています。
これをより詳細に説明する準備されたステートメントを読んでください。