【问题标题】:cakephp escape function or mysql_real_escape_string is not safe?cakephp 转义函数或 mysql_real_escape_string 不安全?
【发布时间】:2012-07-25 15:54:41
【问题描述】:

今天我们的服务器出现了奇怪的问题。 我们已经从 % 和 _ 登录 mysql 查询中获得了 DDOS,它们已成功通过 GET 请求。例如

domain.com/search/%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25v%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25a

好像 cakephp 没有过滤它们?在official mysql guide 他们写了很多关于这个问题的文章。这就是他们演示解决这个问题的方式:

addcslashes(mysql_real_escape_string(“%something_”), “%_”); 

在 cakephp 框架中有函数 escape() 在模型中随处使用。看看里面有什么:

/** 
 * Returns a quoted and escaped string of $data for use in an SQL statement.
 *
 * @param string $data String to be prepared for use in an SQL statement
 * @param string $column The column into which this data will be inserted
 * @param boolean $safe Whether or not numeric data should be handled automagically if no column data is provided
 * @return string Quoted and escaped data
 */ 
    function value($data, $column = null, $safe = false) {
        $parent = parent::value($data, $column, $safe);

        if ($parent != null) {
            return $parent;
        }   
        if ($data === null || (is_array($data) && empty($data))) {
            return 'NULL';
        }   
        if ($data === '' && $column !== 'integer' && $column !== 'float' && $column !== 'boolean') {
            return "''";
        }   
        if (empty($column)) {
            $column = $this->introspectType($data);
        }   

        switch ($column) {
            case 'boolean':
                return $this->boolean((bool)$data);
            break;
            case 'integer' :
            case 'float' :
            case null :
                if ($data === '') {
                    return 'NULL';
                }   
                if (is_float($data)) {                                                                                                               
                    return str_replace(',', '.', strval($data));
                }
                if ((is_int($data) || is_float($data) || $data === '0') || (
                    is_numeric($data) && strpos($data, ',') === false &&
                    $data[0] != '0' && strpos($data, 'e') === false)) {
                        return $data;
                    }
            default:
                $data = "'" . mysqli_real_escape_string($this->connection, $data) . "'";
            break;
        }   

        return $data;
    }  

只是对一些变量类型和类似这样的东西的基本保护.. 转义 mysql 特殊字符怎么样?大约一年前,我读到如何在 mysql 查询中借助百分号来转义引号 =) 那时是盲目注入的炒作,而且这个技巧几乎无处不在,因为每个人都使用 mysqli_real_escape_string。

我必须在这里提出一个问题:如何在 cakephp 中转义变量 - 真的安全吗?

更新: IRC 中的一些人指出,必须对 REQUEST 字符串进行转义,而不是自行查询。他们可能是对的,那么如何在不使用自定义函数的情况下转义 GET 请求字符串中的 % 和 _ 字符.. 任何清理方法都可以吗?

【问题讨论】:

  • %_ 只是 LIKE 比较上下文中的特殊字符。因此,答案很简单:在将$str 传递到数据库中用于LIKE 比较之前,只需str_replace(array('%', '_'), array('\\%', '\_'), $str)。如果是例如插入或与任何其他比较运算符一起使用,无论如何它并不危险。这真的会导致问题吗?我原以为 MySQL 会将连续不止一个 % 的任何序列视为单个 % - 尽管我可能错了。
  • 是的,我们刚刚遇到了 DDOS,上面有那个 url,这就是为什么它非常重要。我亲自追踪了它
  • 是的,但它实际上有什么影响?它是影响 MySQL 还是仅影响 Web 服务器进程? DDOS 攻击的最终坏结果是什么?

标签: php cakephp sql-injection


【解决方案1】:

这并不意味着 Cake 容易受到 SQL 注入的影响,因为它在底层使用了准备好的语句,这确实意味着您在 CakePHP 中使用了 LIKE 搜索查询并且它允许使用通配符。

我认为这不是理想的行为,因为我在开发过程中也发现了这一点,我只是发现上面的这一行现在使用 LIKE

$term = str_replace('%', ' ', $term); 

您无需亲自进行转义,框架会为您处理。

【讨论】:

  • 嗯,瓶颈可能是 GET 请求字符串,所以我不想为此使用任何自定义方法,我更新了问题 - cakephp 的任何方法都会在请求字符串中转义 % 和 _ 符号?
【解决方案2】:

您展示的代码示例是安全的。这一行:

$data = "'" . mysqli_real_escape_string($this->connection, $data) . "'";

转义特殊字符。该方法检查变量的类型 - 如果它不是字符串,则不需要转义。

很高兴看到mysql_real_escape_string() 所谓的“漏洞”的来源。

【讨论】:

  • mysql_real_escape_string() 中的漏洞仅在您执行SET NAMES 查询时出现。在这种情况下,libmysql 在执行转义时所做的字符集评估是有缺陷的,因为连接字符集发生了变化,但 libmysql 并不知道它并会在转义操作中继续使用旧的字符集。除此之外,它是安全的,并且可以通过使用 mysql_set_charset() 而不是 SET NAMES 完全缓解问题。是的,安全漏洞很小,但它仍然是一个漏洞。
  • @Juhana 这个函数不会转义 % 和 _ 并且我们最近因为 get 参数中的这个字符而遇到了 DDOS,我只是要求 CAKEPHP 框架中的简单函数可以在 GET 中过滤掉它们细绳。在我看来,默认情况下,这个字符应该用 mysql_real_escape_string() 转义(由 cakephp 中的 sanitazation 类使用)
  • DDOS 与清理无关。如果您使用LIKE,请手动转义字符。在其他任何地方转义 %_ 无效。 Cake 无法自动转义它们,否则你根本无法使用LIKE 查询。
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
相关资源
最近更新 更多