限制中的SQL注入(来自PHP)
我有以下代码:限制中的SQL注入(来自PHP),php,mysql,sql,code-injection,Php,Mysql,Sql,Code Injection,我有以下代码: $req = mysql_query("SELECT * FROM table WHERE id='".mysql_real_escape_string($id)."' ORDER BY lastupdate DESC LIMIT ".mysql_real_escape_string($_GET['start']).", 15 "); 出于某种原因,我似乎可以将一些不可用的SQL代码注入到$\u GET['start']参数中 例如:1100 url编码如下:+1%2C+100
$req = mysql_query("SELECT * FROM table WHERE id='".mysql_real_escape_string($id)."' ORDER BY lastupdate DESC LIMIT ".mysql_real_escape_string($_GET['start']).", 15 ");
出于某种原因,我似乎可以将一些不可用的SQL代码注入到$\u GET['start']参数中
例如:1100 url编码如下:+1%2C+100%23
我很确定你不能真的用它来破坏或窃取我的db UNION的任何东西,因为ORDER BY无法工作,mysql\u query不允许多个查询
我知道我应该添加intval以确保它是一个整数。我的主要问题是为什么。。。它为什么有效?我真的不明白
非常感谢您的见解。您应该将其解析为整数
$req = mysql_query("SELECT * FROM table WHERE id='".(int)$id."' ORDER BY lastupdate DESC LIMIT ".(int)$_GET['start'].", 15 ");
此外,应强烈考虑使用或
mysql_*和mysqli_*函数不知道表的结构是什么。函数mysql\u real\u escape\u string将所有内容都视为字符串,只是为了使其安全。您不能利用此漏洞,因为为了对单个SELECT应用order BY或LIMIT,您需要将子句放在包含SELECT的括号内。然而,我读了一遍又一遍,我仍然不知道为什么。。。我唯一想的是,也许这是一个引用的东西。。。但我不能这样做:限制'1',15,所以我看不到一种方法来保证它的安全…你需要了解mysql\u real\u escape\u string的实际功能。不幸的是,关于如何正确使用它,本文没有那么具体。“转义字符串中的特殊字符以用于SQL语句”应该改为:“转义字符串中的特殊字符以用于MySQL字符串文字”。是的,我知道。。。但是为什么它会起作用呢?为什么它会绕过mysql\u real\u escape\u字符串?我已经更新了答案。。你觉得满意吗?