1

因此,即使使用 %27 对数据进行了清理,您也可以只进行 SQL 注入mysql_real_escape_string

%27) SQL INJECTION HERE %2F*

该怎么办?

编辑示例:

$sql = sprintf("SELECT *, MATCH(post) AGAINST ('%s*' IN BOOLEAN MODE) AS score FROM Posts WHERE MATCH(post) AGAINST('%s*' IN BOOLEAN MODE)",
                mysql_real_escape_string($_GET['searchterm']),
                mysql_real_escape_string($_GET['searchterm']));

$results = $db->queryAsArray($sql);

如果您传入%27) SQL INJECTION HERE %2F*搜索词查询字符串,我会在页面上输出:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“BOOLEAN MODE)”附近使用正确的语法

感谢大家在 db 类中找到问题..

4

4 回答 4

2

从方法名称推断queryAsArray,您似乎正在使用MySQL 函数手册页的注释中的这个DbBase类。如果是这样,它是query从转义引号中删除转义字符的方法:

function query($sql, &$records = null){
    $sql = str_replace(array('\\"', "\\'"), array('"', "'"), $sql);
    // …
}

那么您的示例有效(我简化了它)并不是一个奇迹:

$input = "', BAD SQL INJECTION --";

$sql = "SELECT '".mysql_real_escape_string($input)."'";
var_dump($sql);  // string(33) "SELECT '\', BAD SQL INJECTION --'"
//                      everything’s OK ↑

$sql = str_replace(array('\\"', "\\'"), array('"', "'"), $sql);
var_dump($sql);  // string(32) "SELECT '', BAD SQL INJECTION --'"
//                                Oops! ↑
于 2011-03-14T21:29:43.117 回答
1

我们手册中提到的注释已被标记为删除。一旦它传播到我们网络中的所有镜像,它将不再附加到官方文档中。

~ Daniel P. Brown
  Network Infrastructure Manager
  http://php.net/
于 2011-03-15T17:45:24.717 回答
0

最好不要构建这样的语句,而是使用 mysqli 或 PDO 使用带参数的查询。这将解决 MySQL 注入的问题,并且有一天(还没有,不幸的是)它也会表现得更好,因为查询是在没有参数的情况下缓存的,这意味着您在缓存中只有一个查询,而不是几十个不同的查询,因为单个输入值一直在变化。其他数据库很早就使用了这一点,但 MySQL 只是设法从最新版本开始不让参数化查询变慢。

%27 实际上会终止字符串看起来不太合理。在字符串中嵌入引号似乎更像是一种可能性,但我不确定。

可以肯定的是,我决定牺牲我的服务器并进行测试。当我在使用 mysql_real_escape_string 转义然后插入数据库的输入字段和 textarea 中输入 %27 时,我没有收到任何错误。文本%27刚刚插入。所以完全没有问题。

于 2011-03-14T21:52:07.993 回答
-1

你错了。这里不能注射。

遵循这三个简单的规则

  1. 客户端的编码正确设置mysql_set_charset()
  2. 数据被转义using mysql_real_escape_string()
  3. 并用引号括起来

你可以确定不可能注射

于 2011-03-14T21:02:14.197 回答