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

SQLインジェクション保護

    これはではありません SQLインジェクションとは何ですか。 SQLクエリでサニタイズされていないパラメータを使用するときはいつでも、データベースをSQLインジェクションに対して開いたままにします。これは、必ずしもデータを破棄するという目的を持っているとは限りません。また、データを盗んだり、不正アクセスを取得したりする可能性もあります。

    SELECTしか実行できない非常に制限されたアカウントについて考えてみます。 。認証用のクエリを作成します:

    $sql = "SELECT COUNT(*) AS count
              FROM users 
             WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";
    
    // check if returns a count of 1, if yes, log in
    

    通常の入力では、クエリは次のようになります。

    SELECT COUNT(*) AS count
      FROM users 
     WHERE user_id = 'username' AND pass='********'
    

    ユーザー名とパスの両方が一致する場合、カウントとして1を返す必要があります。ここで、攻撃者は管理者としてログインしようとします。入力をサニタイズしていないため、$_POST['user']が送信されます。 as:admin'; -- 。クエリ全体は次のようになります:

    SELECT COUNT(*) AS count
      FROM users 
     WHERE user_id = 'admin'; -- AND pass='********'
    

    --以降のすべて はコメントであるため、これは他の条件を無視し、関係なく1を返します。さあ、悪意のあるユーザーに管理者アクセスを許可しました。このようにして、実際の攻撃が実行されます。特権の低いアカウントから始めて、セキュリティの穴から、より多くの特権にアクセスしようとします。

    簡単に言うと、権限が制限されたアプリケーション全体のアカウントを持っている(例:DROPなし) 、ALTER 、など)良いです。誰かまたはアプリケーションに必要以上の特権を与えないでください。ただし、SQLインジェクションを防ぐには、プリペアドステートメント を使用してください。 。



    1. MariaDBでのUTC_TIMESTAMP()のしくみ

    2. Yii2で一括データベース挿入を行う方法は?

    3. 2つの別々のMySQLクエリの結果を組み合わせる

    4. SQLとのタイムゾーンの調整