Codeigniter如何处理转义输出?

时间:2012-01-04 04:43:18

标签: php codeigniter

我正在使用CodeIgniter。

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

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

使用以下命令从服务器到浏览器:

htmlentities()
htmlspecialchars()

在我的Codeigniter应用程序中,这些功能如何处理?它是由框架内部处理的,还是我必须手动处理它?<​​/ p>

在Ccodeigniter表单验证中,我看到xss_clean

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

xss_clean用于阻止跨站点脚本编写,还是处理我上面提到的上述内容?

5 个答案:

答案 0 :(得分:15)

如果您正在使用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() - 如果你知道自己在做什么,就不应该需要它。最好在输出上使用而不是输入。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

在codeigniter中,如果你没有使用活动记录类,那么只需在sql查询中使用

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

答案 3 :(得分:0)

  

在自定义帮助文件中添加此函数

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"); ?>

答案 4 :(得分:0)

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

while(<>) {
  s/(*.)/\L\1/g;
}