【问题标题】:How does Codeigniter handle escaping output?Codeigniter 如何处理转义输出?
【发布时间】:2012-01-04 04:43:17
【问题描述】:

我正在使用 CodeIgniter。

最近,我读了一本 PHP 书,看到了一些使用

将输出转义到服务器到数据库的函数
*_escape_string()

从服务器到浏览器使用:

htmlentities()
htmlspecialchars()

在我的 Codeigniter 应用程序中,这些函数是如何处理的?是由框架内部处理,还是我必须手动处理?

在 Ccodeigniter 表单验证中我见过xss_clean

$this->form_validation->set_rules('password', 'Password', 'required|xss_clean|min_length[6]|matches[confirmpassword]' );

xss_clean 是为了防止跨站脚本,还是针对我上面提到的?

【问题讨论】:

  • 需要注意的一点:您从不想在密码上使用xss_clean,就像在您的示例中一样。事实上,您根本不应该更改密码输入,假设它在保存之前已经过哈希处理(当然应该如此)。

标签: php codeigniter


【解决方案1】:

如果您使用 Active Record 类,通常不需要转义发送到数据库的任何内容 - 它会自动完成:

http://codeigniter.com/user_guide/database/active_record.html

“它还允许更安全的查询,因为系统会自动转义值。”

手动转义似乎已成为过去,因为大多数人现在使用PDO 进行数据库交互,使用带占位符的参数化查询,而不是将 SQL 字符串混合在一起。不过 CI 在内部仍然使用mysql_* 函数。

在我看来,CI 的xss_clean() 对于我们这些不知道如何以及何时正确转义数据的人来说更像是一种故障保护。你通常不需要它。它一直是批评的目标,因为它在清理数据方面缓慢而激进,而且“不够好”。

对于转义 HTML 输出,在大多数情况下,您只需要 htmlspecialchars(),但您可以随时使用 xss_clean() 函数。我不建议将其用作表单验证规则,因为它会破坏您的输入,将[removed] 插入到原始字符串中发现“顽皮”的任何地方。相反,您可以手动调用它来清理您的输出

总结:

  • 数据库:CI 将(通常)转义您传递给 Active Record 类的字符串。
    有关详细信息,请参阅用户指南:http://codeigniter.com/user_guide/database/queries.html

  • HTML 输出:您需要自己使用htmlspecialchars() 转义HTML 输出或使用CI 的html_escape() 函数(从2.1.0 开始)。这不会自动完成,因为无法知道您使用数据的上下文。

  • xss_clean() - 如果你知道你在做什么,你就不应该需要它。更好地用于输出而不是输入。

【讨论】:

【解决方案2】:

默认 CodeIgniter 视图只是 PHP,因此您可以在视图文件中使用 htmlentities() 和 htmlspecialchars()。

为了将数据转义到数据库中(即防止 SQL 注入)CodeIgniter 提供参数化查询。基本上,放一个?在 SQl 中要插入数据的任何地方,然后提供数组中的所有数据。请参阅http://codeigniter.com/user_guide/database/queries.html 处的“查询绑定”。同样在该页面上,请参阅描述 *_escape_string 函数的 CI 包装器的“转义查询”。但是,查询绑定/参数化查询是更好的方法。

【讨论】:

  • 那么框架内部不处理 htmlentities() 和 htmlspecialchars() ??
  • @KanishkaPanamaldeniya 不,因为 escaping 或任何你可以称之为的东西都应该在使用该值之前发生。如果 CI 对 any html per se 进行编码,那么无论如何,您的视图都不会起作用。 HTML 需要在页面上输出之前进行转义,并且只有在您需要时才需要转义。因此,没有任何健全的框架会在代码看到 html 后立即对其进行清理。希望我清楚
【解决方案3】:

如果您没有使用活动记录类,则在 codeignater 中仅在 sql 查询中使用

$this->db->escape($varaiable)

【讨论】:

    【解决方案4】:

    在自定义帮助文件中添加此功能

    function escape_output($string)
    {
        $newString = str_replace('\r\n','<br/>',$string);
        $newString = str_replace('\n\r','<br/>',$newString);
        $newString = str_replace('\r','<br/>',$newString);
        $newString = str_replace('\n','<br/>',$newString);
        $newString = str_replace('\'','',$newString);
        return $newString;
    }
    

    视图中的调用函数

    <?php echo escape_output("Bhavin\'s \"code"); ?>
    

    【讨论】:

      【解决方案5】:

      你可以创建一个辅助函数:

      function my_escape($str) {
      if (get_magic_quotes_gpc()) {
          $str = stripslashes($str);
      }
      return str_replace("'", "''", $str);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 2017-01-22
        相关资源
        最近更新 更多