Mysql真正的转义字符串其他问题

时间:2013-02-02 12:01:34

标签: php mysql sql-injection

  

可能重复:
  How to prevent SQL injection in PHP?

考虑这个片段,

*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”

查询将是, SELECT * FROM人员WHERE uid = 56或1 并导致成功注入。

那么在列是数字类型的情况下我们如何保护自己?
在没有使用pdo或预处理语句的情况下,是否还有其他解决方法?

1 个答案:

答案 0 :(得分:0)

mysql_real_escape_string有没有“其他问题”。

大多数人都混淆了这个功能,认为它的目的是通过“cleaninig”来保护他们不受“用户输入”的影响。
这肯定是错误的。
mysql_real_escape_string用于格式化字符串,使它们适合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";

但请记住,还有其他需要不同治疗的病例

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