Php Codeigniter html到数据库问题

Php Codeigniter html到数据库问题,php,codeigniter,input-filtering,Php,Codeigniter,Input Filtering,我正在开发一个允许用户提交博客文章的网站,但似乎有一个小问题。我使用的是global\u xss\u过滤(TRUE),因此所有内容都将被过滤掉 但是,当我使用xss\u过滤HTML标记时,像等被删除。如果我将global_xss_filtering设置为FALSE一切都很好 但是,如果将globalxss_filtering设置为TRUE并同时进行安全保护,我如何才能使这项功能正常工作呢?有什么建议吗 在应用XSS验证之前,您可以使用htmlEntity(),然后从数据库获取它时,您可以使用ht

我正在开发一个允许用户提交博客文章的网站,但似乎有一个小问题。我使用的是
global\u xss\u过滤
TRUE
),因此所有内容都将被过滤掉

但是,当我使用
xss\u过滤
HTML标记时,像
等被删除。如果我将
global_xss_filtering
设置为
FALSE
一切都很好


但是,如果将
globalxss_filtering
设置为
TRUE
并同时进行安全保护,我如何才能使这项功能正常工作呢?有什么建议吗

在应用XSS验证之前,您可以使用htmlEntity(),然后从数据库获取它时,您可以使用html_entity_decode()。

简短版本:您不能

长版本:过滤HTML以移除邪恶的东西是一项棘手的工作。仅仅将标签类型列入黑名单来阻止像
script
frame
这样的标签是不够的,因为HTML是不断变化的。即使您跟踪了所有新的标记类型,攻击者也可以将Javascript附加到图像调用。即使您成功地过滤掉了所有调用Javascript的标记属性,而没有删除有用的东西,如
src
href
height
(这几乎是不可能的,因为它们有十亿个),您仍然不安全。您无法确保每个浏览器都正确地实现每个标记。此外,您不能确定当前的实现永远不会改变。可能会引入新的bug

相信我,使用或之类的东西更容易保护。

问题在于:

启用全局xss_clean时,所有
$\u GET
$\u POST
$\u COOKIE
数据都由输入类构造函数通过
\u sanitize\u globals()
进行清理

在CI执行过程中,这种情况发生得太早,您以后无法对此进行任何处理。一旦数据被
xss_清理
,就不可能取消清理

您有两个选择:

  • 使用预处理系统
  • 禁用全局xss_清理
对于如何使用钩子,我没有任何建议,但我建议只禁用全局xss_clean,原因如下:

  • 显而易见:它不会改变数据,并将您控制住,鼓励您注意XSS攻击实际发生的时间和地点

  • xss_clean函数非常繁重且具有攻击性,大多数情况下您并不需要它。在每个post、get和cookie项上运行它会消耗执行时间

  • 添加
    xss_clean
    作为表单验证规则,或者使用
    $this->security->xss_clean()

  • 作为一种最佳实践,您仍然应该清理数据和HTML输出,而不是信任全局过滤器并忘记它

例如,我需要允许CMS使用
标记,而禁用全局过滤器是让它们通过的唯一方法。这是一个很大的变化,可能会让你感到紧张,但不幸的是,这是唯一的办法(除非你能想出如何编写一个有用的钩子)


如评论中所述,它不应该过滤标签…

它正在触摸标签?根据他们的消息来源,这不是一个“顽皮”的标签:似乎CI有一个非常具体的标签集,他们过滤掉你的安全;请查看此列表的链接。这个问题有几年了
global_xss_filtering
在CodeIgniter V3中已被弃用。