sql >> データベース >  >> RDS >> Mysql

SQLインジェクションはどのように機能し、どのように保護しますか

    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つの値を期待し、それをどこに配置するかを認識します。次に、その値をデータベースに渡して、検索に使用できるようにします。データベースがクエリを最適化して検索を高速化できるため、これも優れています。

    これをより詳細に説明する準備されたステートメントを読んでください。



    1. 関係のために許可が拒否されました

    2. Neo4j-Cypherを使用して関係を作成する

    3. MySQL挿入エラー:ER_BAD_FIELD_ERROR:「フィールドリスト」の不明な列「2525」

    4. データは、sqliteのすべてのテーブルではなく、特定のテーブルの日付から入力されます