考虑这个片段,
*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或预处理语句的情况下,是否还有其他解决方法?
答案 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";
但请记住,还有其他需要不同治疗的病例
还有一件事要补充 手动格式化数据很无聊 让一些代码为你做的更好,使代码既简短又安全