我正在使用HTML5和Javascript构建WYSIWYG编辑器。 我允许用户通过WYSIWYG发布纯HTML,因此必须对其进行清理。
保护站点免受跨站点脚本(XSS)这样的基本任务正在成为一项艰巨的任务,因为它没有最新的净化功能。过滤器 - 用于PHP的软件。
HTML Purifier 目前不支持HTML5,整体状态看起来很糟糕(HTML5支持不会很快到来)。
那么我应该如何使用PHP(后端)清理不受信任的HTML5?
到目前为止的选项......
那里还有其他选择吗? PHP死了吗? ;)
答案 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清理程序暴露于指数级复杂性,并不保证任何内容。
你说这是一个卫生问题,而不是前端问题。我不同意,因为你无法处理所有现在和将来的HTML实体,你最好将其限制在前端级别100%确定。
这就是说,或许以下是适合您的解决方案:
strip_tags()
。preg_replace()
和一些正则表达式。$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