假设我们有这样的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“部分,即使是上面的格式化吗?
答案 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