Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql真实转义字符串其他问题_Php_Mysql_Sql Injection - Fatal编程技术网

Php Mysql真实转义字符串其他问题

Php Mysql真实转义字符串其他问题,php,mysql,sql-injection,Php,Mysql,Sql Injection,可能重复: 考虑一下这个片段 *mysqltest.php* $user_id= $_GET['user_id']; $user_id= mysql_real_escape_string($user_id); $query = "SELECT * FROM people WHERE uid=".$user_id; echo $query; //then execution .. 现在,当我们将这个脚本称为“mysqltest.php?user_id=56或1”时, 问题是, 从uid=5

可能重复:

考虑一下这个片段

*mysqltest.php*

$user_id= $_GET['user_id'];
$user_id= mysql_real_escape_string($user_id);
$query  = "SELECT * FROM people WHERE uid=".$user_id;
echo $query;
//then execution ..
现在,当我们将这个脚本称为“mysqltest.php?user_id=56或1”时,

问题是, 从uid=56或1的人群中选择*并成功注射

那么,在列为数字类型的情况下,我们如何保护自己呢?

在这些情况下,如果不使用pdo或预先准备好的语句,是否还有其他解决方法?

mysql\u real\u escape\u字符串没有“其他问题”

大多数人混淆了这个功能,认为它的目的是通过“清理”用户输入来保护他们免受注射。
这肯定是错误的。
mysql\u real\u escape\u字符串用于格式化字符串,使其适合SQL查询。这就是全部。作为一种副作用,它也使注射变得不可能

因此,每次要将字符串动态添加到查询中时,它们都必须遵循两种字符串格式规则,无论数据源是什么

  • 用引号将数据括起来
  • 转义其中的特殊字符
因为它们是无用的

尽管把数字当作字符串是可以的。
因此,对于给定的示例,您可以将数据视为字符串,正如删除的答案中所建议的那样

$user_id= $_GET['user_id'];
$user_id= mysql_real_escape_string($user_id);
$query  = "SELECT * FROM people WHERE uid='$user_id'";
唯一的例外是LIMIT子句参数只能是整数。
在这种情况下,唯一的解决方案是手动将数据转换为所需的格式

$user_id= $_GET['user_id'];
$user_id= intval($user_id);
$query  = "SELECT * FROM people WHERE uid=$user_id";
但请记住,还有其他病例需要不同的治疗

还有一件事要补充。
手动格式化数据很无聊。

最好让一些代码来为您做这件事,让代码既短又安全

是数字($user\id)预匹配(“/^[0-9]+$/”,$user\id)您是否在调用数据库调用之前寻找一种验证数据的方法?@everlast您不需要最终用户为某些
user\id
提取数据?@Tadeck:Not validating,但是要防止在列为数值类型(可以是int、float、double..而不是string)时进行注入,因此mysql\u real\u escape\u string不会清除输入。这个片段就是为了演示这种情况。我不是直截了当地问如何防止sql注入,而是提到了特殊情况。这正是我给出的答案,立即被否决了两次。:)@insertusernamehere:如果回答未提供intval($user\u id);他可能还收到了一些downvoteI写的“[…]如果你不将其转换为整数”,并且正在编辑文章,以便在PHP网站上提供指向
intval
的链接。谢谢!成功了。对于第一个,我认为我们必须只使用单引号内的字符串。对于第二个字符串,我应该首先知道它是整数还是小数,所以我更喜欢第一个。确切地说:
mysql\u real\u escape\u string
用于将字符串的某些字符转义,以便正确地放入,并且只在那里。