0

可能重复:
如何防止 PHP 中的 SQL 注入?

考虑这个片段,

*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 or 1”时

查询将是 SELECT * FROM people WHERE uid=56 or 1并导致成功注入。

那么在列是数字类型的这种情况下,我们如何保护自己呢?
在不使用 pdo 或准备好的语句的情况下,在这些情况下是否还有其他解决方法?

4

1 回答 1

0

mysql_real_escape_string没有“其他问题”。

大多数人混淆了这个功能,认为它的目的是通过“cleaninig”以某种方式保护他们免受“用户输入”的注入。
这肯定是错误的。
mysql_real_escape_string 旨在格式化字符串,使它们适合 SQL 查询。就这样。作为副作用,它也使注射变得不可能。

因此,每次将字符串动态添加到查询中时,无论数据源如何,他们都必须遵循两个字符串格式规则:

  • 将数据括在引号中
  • 转义其中的特殊字符

因为没有另一个它们是无用的。

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

$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";

但请记住,还有其他情况需要不同的处理

还有一件事要补充。
手动格式化数据很无聊。
让一些代码为你做这件事要好得多,使代码既短又安全

于 2013-02-02T12:08:58.760 回答