使用PHP清理HTML5(防止XSS)

时间:2014-05-04 11:02:44

标签: php html5 xss wysiwyg sanitize

我正在使用HTML5和Javascript构建WYSIWYG编辑器。 我允许用户通过WYSIWYG发布纯HTML,因此必须对其进行清理。

保护站点免受跨站点脚本(XSS)这样的基本任务正在​​成为一项艰巨的任务,因为它没有最新的净化功能。过滤器 - 用于PHP的软件。

HTML Purifier 目前不支持HTML5,整体状态看起来很糟糕(HTML5支持不会很快到来)。

那么我应该如何使用PHP(后端)清理不受信任的HTML5?

到目前为止的选项......

那里还有其他选择吗? PHP死了吗? ;)

2 个答案:

答案 0 :(得分:1)

PHP提供解析方法以防止代码PHP / SQL注入(即mysql_real_escape_string())。对于HTML / CSS / JavaScript,情况并非如此。为什么?

首先:HTML / CSS / Javascript的唯一目的是显示信息。您可以接受HTML的某些元素或根据您的要求拒绝它们。

其次:由于HTML / CSS / JS元素数量非常多(也在不断增加),因此无法尝试控制HTML。你不能指望一个功能性的解决方案。

这就是我建议采用自上而下的解决方案的原因。 我建议开始限制所有内容,然后只允许一定数量的标记。一个很好的基础可能是使用BBCdode,非常受欢迎。如果你想"解锁"除了BBCode之外的其他特定标签,您可以随时添加一些。

这就是类似BBCode的脚本在论坛和网站上流行的原因(包括堆栈溢出)。 WISIGIG编辑器专为管理员/内部使用而设计,因为您不希望网站管理员注入不良内容。

自下而上的方法发誓要失败。 HTML清理程序暴露于指数级复杂性,并不保证任何内容。


编辑1


你说这是一个卫生问题,而不是前端问题。我不同意,因为你无法处理所有现在和将来的HTML实体,你最好将其限制在前端级别100%确定。

这就是说,或许以下是适合您的解决方案:

  1. 您可以通过去除所有实体来清理代码 使用PHP strip_tags()
  2. 的白名单除外
  3. 您还可以删除所有剩余的代码属性(属性) 使用PHP的preg_replace()和一些正则表达式。

  4. $string = "put some very dirty HTML here.";
    $string = strip_tags($string, '<p><a><span><h1><li><ul><br>');
    $string = preg_replace("/<([b-z][b-z0-9]*)[^>]*?(\/?)>/i",'<$1$2>', $string);
    echo $string;
    

    这将返回您已清理的文字。

    注意:我已经排除了标签的属性删除,因为您可能仍希望保留href =&#34;&#34;属性。因此[b-z][B-Z]正则表达式。

答案 1 :(得分:0)

我相信理想是使用组合:

  mysql_real_escape_string(addslashes($_REQUEST['data']));

写入

   stripslashes($data) 

on read总是对我有用,我认为它比

更好
  htmentities($data) on write

  html_entity_decode($data) on read