只是看着:
(来源:https ://xkcd.com/327/ )
这个 SQL 做了什么:
Robert'); DROP TABLE STUDENTS; --
我都知道'并且是为了发表评论,但由于它是同一行的一部分,所以--这个词也没有得到评论吗?DROP
'
--
DROP
它掉落了学生表。
学校程序中的原始代码可能看起来像
q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";
这是将文本输入添加到查询中的幼稚方法,并且非常糟糕,正如您将看到的那样。
在名字、中间名文本框FNMName.Text(即Robert'); DROP TABLE STUDENTS; --)和姓氏文本框LName.Text(我们称之为Derper)的值与查询的其余部分连接之后,结果现在实际上是两个查询,由语句终止符(分号)。第二个查询已注入第一个查询。当代码对数据库执行此查询时,它将如下所示
Derper
INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')
用简单的英语,大致翻译为两个查询:
Add a new record to the Students table with a Name value of ‘Robert’
和
Delete the Students table
第二个查询之后的所有内容都标记为注释: --', 'Derper')
--', 'Derper')
学生姓名中的'不是评论,它是结束字符串 delimiter。由于学生的姓名是一个字符串,因此在语法上需要它来完成假设查询。注入攻击仅在它们注入的 SQL 查询产生有效的 SQL时才起作用。