6 回答
TA贡献1817条经验 获得超14个赞
它放下了学生桌。
学校计划中的原始代码可能看起来像
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')
用简单的英语粗略地翻译成两个查询:
使用名称值“Robert”向Students表添加新记录
和
删除学生表
超过第二个查询的所有内容都标记为注释: --', 'Derper')
将'
在学生的名字是不是一个评论,它的收盘字符串分隔符。由于学生的名字是一个字符串,因此在语法上需要完成假设的查询。注入攻击仅在它们注入的SQL查询产生有效SQL时才有效。
TA贡献1777条经验 获得超10个赞
正如其他人已经指出的那样,');
关闭原始陈述,然后是第二个陈述。大多数框架(包括PHP等语言)到目前为止都有默认的安全设置,不允许在一个SQL字符串中使用多个语句。例如,在PHP中,您只能使用该mysqli_multi_query
函数在一个SQL字符串中运行多个语句。
但是,您可以通过SQL注入操作现有的SQL语句,而无需添加第二个语句。假设你有一个登录系统,用这个简单的选择来检查用户名和密码:
$query="SELECT * FROM users WHERE username='" . $_REQUEST['user'] . "' and (password='".$_REQUEST['pass']."')";$result=mysql_query($query);
如果您提供peter
用户名和secret
密码,则生成的SQL字符串将如下所示:
SELECT * FROM users WHERE username='peter' and (password='secret')
一切安好。现在假设您提供此字符串作为密码:
' OR '1'='1
然后生成的SQL字符串将是这样的:
SELECT * FROM users WHERE username='peter' and (password='' OR '1'='1')
这样您就可以在不知道密码的情况下登录任何帐户。因此,您不需要能够使用两个语句来使用SQL注入,但如果您能够提供多个语句,则可以执行更具破坏性的操作。
TA贡献1820条经验 获得超9个赞
单引号是字符串的开头和结尾。分号是声明的结尾。所以,如果他们做这样的选择:
Select *From StudentsWhere (Name = '<NameGetsInsertedHere>')
SQL将成为:
Select *From StudentsWhere (Name = 'Robert'); DROP TABLE STUDENTS; --')-- ^-------------------------------^
在某些系统上,select
会首先运行,然后是drop
语句!消息是:不要将值嵌入到您的SQL中。而是使用参数!
添加回答
举报