1. ホーム

[解決済み】XKCDコミック「Bobby Tables」のSQLインジェクションはどのように動作するのでしょうか?

2022-03-23 03:57:33

質問

見ているだけで

(出典 https://xkcd.com/327/ )

このSQLは何をするものなのか。

Robert'); DROP TABLE STUDENTS; --

両方知っている '-- はコメント用ですが、この単語はコメント用ではないのでしょうか? DROP も同じ行の一部なので、コメントされるのでしょうか?

解決方法は?

学生テーブルを削除してしまいます。

学校のプログラムの元のコードは、おそらく次のようなものでしょう。

q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";

これは、クエリにテキスト入力を追加する素朴な方法で、次のようになります。 非常に悪い ということです。

ファーストネーム、ミドルネームのテキストボックスの値の後に FNMName.Text (これは Robert'); DROP TABLE STUDENTS; -- ) と姓のテキストボックス LName.Text (と呼びましょう)。 Derper をクエリの残りの部分と結合すると、その結果は実際には 2つのクエリ で区切られた 文末記号 (セミコロン)を使用します。 2つ目のクエリは 注入 を1つ目に追加しました。 コードがこのクエリをデータベースに対して実行すると、次のようになります。

INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')

という2つのクエリがあり、平たく言えば、この2つのクエリを大まかに訳しています。

Student テーブルに新しいレコードを追加し、Name の値を 'Robert' にします。

そして

学生テーブルを削除する

2つ目のクエリから先は コメントとしてマークされる : --', 'Derper')

' はコメントではなく、生徒の名前の最後にある 文字列デリミタ . 生徒の名前は文字列なので、仮説のクエリを完成させるために構文上必要なのです。 インジェクション攻撃は 注入されたSQLクエリが有効なSQLであるとき .

編集 また 通り dan04 の鋭いコメント