只是看看:
这个 SQL 的作用是:
Robert'); DROP TABLE STUDENTS; --
我知道 '
和 --
都是注释,但是 DROP
这个词也不会被注释,因为它是注释的一部分同一行?
最佳答案
它会删除学生表。
学校程序中的原始代码可能类似于
q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";
这是将文本输入添加到查询中的简单方法,并且非常糟糕,正如您将看到的。
在名字的值之后,中间名文本框FNMName.Text(即Robert');放下 table 上的学生; --
)和姓氏文本框LName.Text(我们称之为Derper
)与查询的其余部分连接起来,现在的结果实际上是< em>两个查询由 statement terminator 分隔(分号)。第二个查询已注入(inject)到第一个查询中。当代码对数据库执行此查询时,它将如下所示
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
第二个查询之后的所有内容都是 marked as a comment : --', 'Derper')
学生姓名中的'
不是注释,而是结束语string delimiter 。由于学生的姓名是一个字符串,因此在语法上需要它来完成假设的查询。注入(inject)攻击只有在注入(inject)的 SQL 查询产生有效的 SQL 时才会起作用。
根据dan04再次编辑精辟的评论
关于security - "Bobby Tables"XKCD 漫画中的 SQL 注入(inject)是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/332365/