これはではありません 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インジェクションを防ぐには、プリペアドステートメント
を使用してください。 。