首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何预防MySQL睡眠注射?

问如何预防MySQL睡眠注射?
EN

Stack Overflow用户
提问于 2013-01-27 07:23:26
回答 4查看 15.3K关注 0票数 6

最近,一位黑客试图用睡眠注入来减缓我的网站。尽管我们正在使用像mysql_real_escape_string()这样的预防措施来覆盖大多数易受攻击的输入。我们正在通过查询字符串传递产品的id,它使命令如下:

代码语言:javascript
复制
$id = mysql_real_escape_string($_REQUEST['id']);
$qry = "Select * from products where id = ".$id;

但是黑客试图提供输入

代码语言:javascript
复制
?id=3 and sleep(4)

而查询变成

代码语言:javascript
复制
Select * from products where id = 3 and sleep(4);

尽管有一些可能的解决方案

  1. 检查产品id是否为数字。
  2. 使用自定义函数从输入中删除单词睡眠

还有其他方法来阻止这种情况吗?预防注射睡眠的最佳方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-27 07:30:15

你逃错了。mysql_real_escape_string用于正确地转义string语法,但您只是将值嵌入为裸值,而不是作为string嵌入。你需要:

代码语言:javascript
复制
$qry = "SELECT * FROM products WHERE id = '$id'";

注意查询中id周围的引号。

但是,如果id是数字,那么转换为一个数字就更明智了:

代码语言:javascript
复制
$id = (int)$_GET['id'];
票数 21
EN

Stack Overflow用户

发布于 2013-01-27 07:28:47

防止SQL注入的最佳方法是使用现有技术。MySQL mysql_系列函数被废弃,并将在以后的修订版中从mysql_中删除。

您应该将准备好的语句与MySQLi或PDO一起使用。

这些技术使用准备好的语句和参数化查询。SQL语句由数据库服务器与任何参数分别解析。攻击者不可能注入恶意SQL。

要实现这一点,您基本上有两种选择:

  1. MySQLi: $stmt =$dbConnection-> $row (‘SELECT* FROM table WHERE = ?');$stmt->bind_param('s',$name);$stmt->$row();$result =$stmt->get_$row();$row=$$row->fetch_assoc(){ //使用$row}
  2. PDO: $stmt =$pdo->准备(‘SELECT* FROM表,其中名称= : name ');$stmt->执行(数组(’:name‘=> $name));foreach ($stmt as $row) { //使用$row }

所发生的情况是您传递给prepare的SQL语句是由数据库服务器解析和编译的。通过指定参数( ?或像:name这样的命名参数),您可以告诉数据库引擎要筛选什么。然后,当您调用execute时,准备语句将与您指定的参数值组合。

重要的是,参数值是与已编译语句(而不是SQL字符串)组合的。SQL注入的工作方式是,在创建要发送到数据库的SQL时,将脚本欺骗为包含恶意字符串。因此,通过将实际SQL与参数分开发送,可以限制最终得到您不想要的东西的风险。在使用预准备语句时发送的任何参数都将被视为字符串(当然,数据库引擎可能会进行一些优化,因此参数也可能是数字)。

票数 11
EN

Stack Overflow用户

发布于 2013-01-27 07:30:55

问这个问题是错误的。

“如何防止mysql注射?”必须是。睡觉还是不睡觉-没关系。

关于这个问题,已经有很多的答案了

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14545340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档