見ているだけで:
(ソース:https://xkcd.com/327/)
この SQL は何を行いますか:
Robert'); DROP TABLE STUDENTS; --
'
どちらもコメント用であることは知っていますが、同じ行の一部なので、--
その単語もコメント化されるのではないですか?DROP
ベストアンサー1
学生テーブルを削除します。
学校のプログラムの元のコードはおそらく次のようになります
q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";
これはクエリにテキスト入力を追加する単純な方法であり、後でわかるように非常に悪い方法です。
ファーストネーム、ミドルネームのテキストボックスFNMName.Text(Robert'); DROP TABLE STUDENTS; --
)とラストネームのテキストボックスLName.Text( と呼ぶことにしますDerper
)の値がクエリの残りの部分と連結された後、結果は実際には文末記号(セミコロン)。2番目のクエリは最初のクエリに挿入されています。コードがこのクエリをデータベースに対して実行すると、次のようになります。
INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')
これを平易な英語で表現すると、おおよそ次の 2 つのクエリになります。
名前の値が「Robert」である新しいレコードを Students テーブルに追加します。
そして
学生テーブルを削除する
2番目のクエリ以降のすべてはコメントとしてマーク:--', 'Derper')
'
生徒の名前の部分はコメントではなく、締めくくりの言葉です文字列区切り文字学生の名前は文字列なので、仮想クエリを完了するには構文的に必要です。インジェクション攻撃は、挿入した SQL クエリが有効な SQL になる場合にのみ機能します。
再度編集しましたダン04の鋭いコメント