将限制GET参数直接传递给MySQL安全问题?

时间:2012-03-15 17:00:20

标签: mysql security limit dos

我想知道拥有类似于以下内容的网址是否存在安全风险

http://www.mytestapp.com/results?limit=1234

然后将限制GET参数检查为有效整数并直接传递给查询。

如果用户将此参数更改为非常大的数字,会发生什么?对于一个庞大的数据库会产生类似于拒绝服务的效果吗?

拥有可变结果限制的最佳做法是什么?

3 个答案:

答案 0 :(得分:1)

不要只是将GET变量直接传递给您的查询。如果你这样做,那么我可以这样做SQL注入:

http://www.mytestapp.com/results?limit=1%3BDROP%20TABLE%20USERS

您的查询最终会显示为:

select * from some_table where parameter = 3 limit 1;DROP TABLE USERS

我假设您正在尝试进行分页。如果是这样,你会想要像:

http://www.mytestapp.com/results?page=1&size=10

然后,在您的后端,验证pagesize是否都是整数,并且两者都是合理的大小。例如,可能会设置size可能的限制,也许只有10到100的倍数。

答案 1 :(得分:0)

在get字符串中传递参数的主要问题是它可以打开你的SQL注入攻击。如果有人通过这个怎么办:

  

http://www.mytestapp.com/results?limit=1234;drop表用户;

您需要仔细观察以确保消毒您的输入。

假设您对此有所了解并了解安全性,那么另一个问题是它将您的限制放在最终用户手中。他们可以通过使用非常大的数量来有效地消除限制。根据查询的复杂程度和表的大小,这可能会对服务器性能和其他用户产生负面影响。

由于限制条款中的大量数字,我不知道任何其他问题。例如,我不认为你需要担心溢出。

答案 2 :(得分:0)

正如其他人设置的那样,在将输入传递给数据库之前验证输入,确保它是一个整数,除了数字之外不包含任何内容,并且具有合理的大小值。对于这种情况,您将有效地防止SQL注入。

您也不应该通过将命令逻辑与来自不受信任来源的参数连接来构建查询字符串。您应该使用参数化查询,在创建它时,您可以在其中确定数据适合SQL语句的位置,然后在以后绑定该值。这样做的结果是允许数据库区分您想要命令的数据,即使您在输入验证中错过了攻击案例,也可以阻止SQL注入(对于这种特殊情况,白名单很容易...这并非总是如此,甚至可能。您可以在精心编写的OWASP SQL Injection Prevention Cheat Sheet页面上阅读有关参数化查询的更多信息。