一个正确的SQL语句格式可以减轻SQL注入吗?

时间:2014-02-06 12:33:31

标签: sql sql-injection

假设我们有这样的SQL语句(运行MySQL 5.6):

SELECT * FROM order WHERE orderid = 12345 LIMIT 0, 1

假设用户提供了一个orderid(取自请求网址)。我们有这个“LIMIT 0,1”部分,通常只返回1行结果,但攻击者可以使orderid像“12345 OR 1 = 1”

SELECT * FROM order WHERE orderid = 12345 OR 1=1 LIMIT 0, 1

现在这将再次返回1行。 现在攻击者将内联注释添加到orderid变量“12345 OR 1 = 1 - ”

SELECT * FROM order WHERE orderid = 12345 OR 1=1 -- LIMIT 0, 1

这次攻击者会收到每个订单的记录,因为他注释掉了“LIMIT 0,1”部分。

但是,如果使用正确的格式:

 SELECT * 
 FROM   order
 WHERE  orderid = 12345
 LIMIT 0, 1

内联注释( - )不会注释掉“LIMIT 0,1”,因为它在新行上。

攻击者可以以某种方式移除'LIMIT 0,1“部分,即使是上面的格式化吗?

3 个答案:

答案 0 :(得分:2)

将查询更改为多行(在任何其他格式上)不是“真正的”安全措施。

在将输入放入查询之前,应始终检查输入,并且应根据输入类型进行输入验证。如果预期输入是一个数字,请确保输入是所有数字(没有字母,没有空格),并且其大小是有限的。如果预期的输入是文本的,则转义应在SQL中转义的所有字符,并再次验证输入的大小是否合理。这些措施将解决一般情况。

我建议您快速搜索Google以防止SQL注入,以获得更多此类见解。

答案 1 :(得分:1)

至少攻击者可以通过注入

来选择不同的行
 OR orderid = 1 ORDER BY orderid

我在sqlfiddle上准备了一个例子。顺便说一句。您的示例代码不正确。您使用保留字(顺序)作为表名。我不得不修改你的代码。

尽管如此,我不认为使用代码格式作为代码注入的措施是一个非常好的主意。我建议首先清理用户输入,然后使用绑定变量。

答案 2 :(得分:1)

不,它不会阻止它,注射器可以写:

12345 OR 1 = 1; SELECT * FROM `order`;

制作完整的SQL:

 SELECT * 
 FROM   `order`
 WHERE  orderid = 12345 OR 1 = 1; SELECT * FROM `order`
 LIMIT 0, 1;

仍将返回第一个结果集中的所有订单,如here所示。

不要试图重新发明轮子,参数化查询和准备好的陈述是有原因的!

最好的网站之一是Bobby-tables.com