看看:
(来源:https://xkcd.com/327/)
这个SQL做什么:
Robert'); DROP TABLE STUDENTS; --
我知道'和——都是用来评论的,但是DROP这个词不是也会被评论吗?因为它是同一行的一部分。
看看:
(来源:https://xkcd.com/327/)
这个SQL做什么:
Robert'); DROP TABLE STUDENTS; --
我知道'和——都是用来评论的,但是DROP这个词不是也会被评论吗?因为它是同一行的一部分。
当前回答
单引号是字符串的开始和结束。分号是语句的结束。如果他们做这样的选择:
Select *
From Students
Where (Name = '<NameGetsInsertedHere>')
SQL将变成:
Select *
From Students
Where (Name = 'Robert'); DROP TABLE STUDENTS; --')
-- ^-------------------------------^
在某些系统上,select语句会先运行,然后是drop语句!信息是:不要嵌入值到你的SQL。而是使用参数!
其他回答
假设名称用于变量$ name。然后运行这个查询:
INSERT INTO Students VALUES ( '$Name' )
该代码错误地将用户提供的任何内容作为变量。你希望SQL是:
插入学生价值观(“罗伯特表格”)
但聪明的用户可以提供他们想要的任何东西:
INSERT INTO Students VALUES ('Robert');DROP TABLE Students;——”)
你得到的是:
INSERT INTO Students VALUES ( 'Robert' ); DROP TABLE STUDENTS; --' )
——only注释该行的其余部分。
数据库的作者可能做了一个
sql = "SELECT * FROM STUDENTS WHERE (STUDENT_NAME = '" + student_name + "') AND other stuff";
execute(sql);
如果给出的是student_name,则使用名称“Robert”进行选择,然后删除表。“——”部分将给定查询的其余部分更改为注释。
它是这样工作的: 假设管理员正在查找学生的记录
Robert'); DROP TABLE STUDENTS; --
由于admin帐户拥有很高的权限,因此可以从该帐户中删除表。
从请求中检索用户名的代码是
现在查询是这样的(搜索student表)
String query="Select * from student where username='"+student_name+"'";
statement.executeQuery(query); //Rest of the code follows
生成的查询变成
Select * from student where username='Robert'); DROP TABLE STUDENTS; --
由于用户输入没有被净化,上面的查询被操作成两个部分
Select * from student where username='Robert');
DROP TABLE STUDENTS; --
双破折号(——)将注释掉查询的其余部分。
这是很危险的,因为如果存在密码验证,它会使密码验证无效
第一个会进行正常的搜索。
如果帐户有足够的权限,第二个将删除表student(通常学校管理帐户将运行这样的查询,并将具有上面讨论的权限)。
单引号是字符串的开始和结束。分号是语句的结束。如果他们做这样的选择:
Select *
From Students
Where (Name = '<NameGetsInsertedHere>')
SQL将变成:
Select *
From Students
Where (Name = 'Robert'); DROP TABLE STUDENTS; --')
-- ^-------------------------------^
在某些系统上,select语句会先运行,然后是drop语句!信息是:不要嵌入值到你的SQL。而是使用参数!
不,'在SQL中不是注释,而是分隔符。
妈妈假设数据库程序员的请求是这样的:
INSERT INTO 'students' ('first_name', 'last_name') VALUES ('$firstName', '$lastName');
(例如)添加新的student,其中$xxx变量内容直接从HTML表单中取出,不检查格式也不转义特殊字符。
如果$firstName包含Robert');DROP TABLE student;——数据库程序将直接在DB上执行以下请求:
INSERT INTO 'students' ('first_name', 'last_name') VALUES ('Robert'); DROP TABLE students; --', 'XKCD');
ie。它会提前终止插入语句,执行黑客想要的任何恶意代码,然后注释掉可能存在的任何剩余代码。
嗯,我太慢了,我已经看到了8个答案在我之前的橙色带…:-)似乎是一个流行的话题。