"Bobby Tables" XKCD 漫画中的 SQL 注入是如何工作的?

问题描述

学校程序中的原始代码可能看起来像

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

这是将文本输入添加查询中的幼稚方法,并且非常糟糕,正如您将看到的那样。

在名字、中间名文本框FNMName.Text(即Robert'); DROP TABLE STUDENTS; --)和姓氏文本框LName.Text(我们称之为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')

学生姓名中的'不是评论,它是结束字符串 delimiter。由于学生的姓名是一个字符串,因此在语法上需要它来完成假设查询。注入攻击仅在它们注入的 sql 查询产生有效的 sql时才起作用。

解决方法

只是看着:

XKCD 条 (来源:https ://xkcd.com/327/ )

这个 SQL 做了什么:

Robert'); DROP TABLE STUDENTS; --

我都知道'并且是为了发表评论,但由于它是同一行的一部分,所以--这个词也没有得到评论吗?DROP