security - "Bobby Tables"XKCD 漫画中的 SQL 注入(inject)是如何工作的?

标签 security validation sql-injection

只是看看:

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

这个 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/

相关文章:

ruby-on-rails-3 - 导轨 3 : Apply the same validation rules to multiple table fields

php - 将 MySQL 查询转换为可能为空值的准备语句

security - Internet Explorer 阻止此网站显示安全证书错误的内容

java - java中是否有类似于 "Windows-MY"的unix key 存储?

java - Java 平台的描述和运行代码是否存在一系列老的安全问题?

php - 与我的数据库通信的最安全方式?

string - 检查 Joi (hapi.js) 中的空字符串

c# - ASP.NET Core Web API 验证错误处理

sql-server - SQL server 中奇怪的表数据

python - SQLAlchemy 会清理原始 SQL 吗?