Codeigniter html到数据库问题

时间:2011-06-10 23:15:30

标签: php codeigniter input-filtering

我正在开发一个允许用户提交博客帖子的网站,但是,似乎有一点问题。我正在使用global_xss_filteringTRUE),因此所有内容都会被过滤掉。

但是,当我使用xss_filtering时,正删除了<strong>等HTML标记。如果我将global_xss_filtering设置为FALSE,一切都很有效。

但是如何才能将此global_xss_filtering设置为TRUE并同时保护?有什么建议?

3 个答案:

答案 0 :(得分:2)

问题在于:

如果您打开了全局xss_clean,则输入类构造函数会通过$_GET清除所有$_POST$_COOKIE_sanitize_globals()数据。

这种情况在CI执行中发生得太早,您以后可以对此做任何事情。一旦数据为xss_cleaned,就无法取消清理。

您有两种选择:

  • 使用预系统hook
  • 禁用全局xss_clean

我没有任何关于使用钩子的建议,但我建议简单地禁用全局xss_clean,原因如下:

  • 明显:它不会改变数据,并将置于控制之下,鼓励你注意XSS攻击实际发生的时间和地点。

  • xss_clean函数非常繁重且具有攻击性,大多数情况下您不需要它。在每个帖子,get和Cookie项目上运行它会占用执行时间。

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

  • 非常容易
  • 作为最佳做法,您仍然应该清理数据和HTML输出,而不是信任全局过滤器并忘记它。

我需要为CMS提供<script>标记,并且禁用全局过滤器是获取它们的唯一方法。这是一个很大的变化,可能会让你感到紧张,但不幸的是,这是唯一的方法(除非你能弄明白如何编写一个有用的钩子)。

正如评论中所提到的,它不应该过滤<strong>标签...

答案 1 :(得分:0)

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

答案 2 :(得分:0)

简短版:你不能。

长版:过滤HTML以删除邪恶的东西是一件棘手的事情。将标记类型列入黑名单以阻止scriptframe等标记是不够的,因为HTML会不断变化。即使您确实跟踪了所有新标记类型,攻击者也可以将Javascript附加到图像onload调用。即使您设法过滤掉所有调用Javascript的标记属性而没有删除有用的内容,例如srchrefheight(这几乎是不可能的,因为其中有十亿个),仍然不安全。您无法确定每个浏览器是否正确实现了每个标记。此外,您无法确定当前的实现永远不会改变。可能会引入新的错误。

相信我,使用markdownrstBBCode之类的内容要容易一千倍。