最近,一位黑客试图用睡眠注入来减缓我的网站。尽管我们正在使用像mysql_real_escape_string()这样的预防措施来覆盖大多数易受攻击的输入。我们正在通过查询字符串传递产品的id,它使命令如下:
$id = mysql_real_escape_string($_REQUEST['id']);
$qry = "Select * from products where id = ".$id;但是黑客试图提供输入
?id=3 and sleep(4)而查询变成
Select * from products where id = 3 and sleep(4);尽管有一些可能的解决方案
还有其他方法来阻止这种情况吗?预防注射睡眠的最佳方法是什么?
发布于 2013-01-27 07:30:15
你逃错了。mysql_real_escape_string用于正确地转义string语法,但您只是将值嵌入为裸值,而不是作为string嵌入。你需要:
$qry = "SELECT * FROM products WHERE id = '$id'";注意查询中id周围的引号。
但是,如果id是数字,那么转换为一个数字就更明智了:
$id = (int)$_GET['id'];发布于 2013-01-27 07:28:47
防止SQL注入的最佳方法是使用现有技术。MySQL mysql_系列函数被废弃,并将在以后的修订版中从mysql_中删除。
您应该将准备好的语句与MySQLi或PDO一起使用。
这些技术使用准备好的语句和参数化查询。SQL语句由数据库服务器与任何参数分别解析。攻击者不可能注入恶意SQL。
要实现这一点,您基本上有两种选择:
所发生的情况是您传递给prepare的SQL语句是由数据库服务器解析和编译的。通过指定参数( ?或像:name这样的命名参数),您可以告诉数据库引擎要筛选什么。然后,当您调用execute时,准备语句将与您指定的参数值组合。
重要的是,参数值是与已编译语句(而不是SQL字符串)组合的。SQL注入的工作方式是,在创建要发送到数据库的SQL时,将脚本欺骗为包含恶意字符串。因此,通过将实际SQL与参数分开发送,可以限制最终得到您不想要的东西的风险。在使用预准备语句时发送的任何参数都将被视为字符串(当然,数据库引擎可能会进行一些优化,因此参数也可能是数字)。
发布于 2013-01-27 07:30:55
问这个问题是错误的。
“如何防止mysql注射?”必须是。睡觉还是不睡觉-没关系。
关于这个问题,已经有很多的答案了
https://stackoverflow.com/questions/14545340
复制相似问题