如何防止URL盲sql注入攻击

时间:2011-11-01 01:21:50

标签: php sql-injection

我有一个在线的网站,我使用acunetix来检查我网站中的网络漏洞。在使用acunetix进行扫描时,它显示了url盲sql注入中的高风险警报。(由于长度较长,我没有使用代码)

例如:url显示vuln

   www.site.com/phpfile.php?1d=1 

我正在使用mysql_real_escape_string函数;此后它也显示出高风险警报。我该如何阻止......

如果有任何一个新的你能告诉我我怎么能隐藏(没有使用.htacess;在我的服务器中.htacess不能正常工作)?id = 1

例如:当用户点击查询时,它应显示此

   www.site.com/phpfile.php

而不是

   www.site.com/phpfile.php?1d=1 

原谅我的英语,并感谢你的帮助

4 个答案:

答案 0 :(得分:3)

你应该使用mysql_real_escape_string()来转义字符串,但是当预期的输入是一个整数时它永远不会有帮助(如果查询中没有引用用户输入,它就不会有任何区别) - 你应该将其转换为整数,使用(int)intval()函数。

此外,我强烈建议您使用预准备语句(例如PDO)或ORM层(例如Doctrine)。

答案 1 :(得分:2)

  

如果有任何一个新的你能告诉我如何隐藏?id = 1

绝对没有意义 隐藏不会给安全带来任何影响 并且应该使用GET方法而不是POST来查看用户的配置文件。

  

我正在使用mysql_real_escape_string函数

此功能与注射无关。它不是“mysql_prevent_injection”,而是“mysql_real_escape_string”。因此,它仅用于格式化字符串。并且必须仅用于字符串。
如果要将数据视为字符串,则必须将其放在引号中。所以,mysql会知道它是一个字符串 人们总是将这两件事一起使用 - 引用和逃避。他们没有另一个没用。

如果您不想将您的号码视为字符串,请将其格式化为数字。

$id = intval($_GET['id']);

你必须根据它的类型格式化字符串的每个部分,而不是随意使用某些函数。

答案 2 :(得分:-2)

如果您知道您的ID应该是一个可以使用的号码:

if(is_numeric($_GET['id'])){
    $id = mysql_real_escape_string($_GET['id']);
}
else{
    ;///////display error
}

答案 3 :(得分:-3)

您可以使用?id=1请求而不是POST

轻松隐藏GET