我正在使用 HTML5 和 Javascript 构建所见即所得的编辑器。 我将允许用户通过所见即所得发布纯 HTML,因此必须对其进行清理。
保护站点免受跨站点脚本 (XSS) 侵害等基本任务正在成为一项艰巨的任务,因为没有适用于 PHP 的最新净化和过滤软件。
HTML Purifier 目前不支持 HTML5,整体状态看起来非常糟糕(短期内不会支持 HTML5)。
那么我应该如何使用 PHP(后端)清理不受信任的 HTML5?
到目前为止的选项...
- HTML 净化器(缺少新的 HTML5 标签、数据属性等)
- 使用 strip_tags() 和 Tidy 或 PHP 的 DOM 类/函数实现自己的净化器
- 使用一些“随机”的 Tidy 实现,例如 http://eksith.wordpress.com/2013/11/23/whitelist-html-sanitizing-with-php/
- Google Caja(Javascript/云)
- htmLawed(有支持 HTML5 的测试版)
还有其他选择吗? PHP 会死吗? ;)
最佳答案
PHP 提供解析方法来防止代码 PHP/SQL 注入(inject)(即 mysql_real_escape_string()
)。 HTML/CSS/JavaScript 不是这种情况。为什么?
首先:HTML/CSS/Javascript 的唯一目的是显示信息。您完全可以根据自己的要求接受或拒绝 HTML 的某些元素。
其次:由于HTML/CSS/JS元素数量非常多(还在不断增加),想要控制HTML是不可能的。您不能指望功能性解决方案。
这就是为什么我建议采用自上而下的解决方案。 我建议开始限制一切,然后只允许一定数量的标签。一个好的基础可能是使用 BBCdode ,很受欢迎。如果您想“解锁”BBCode 之外的其他特定标签,您可以随时添加一些。
这就是类似 BBCode 的脚本在论坛和网站(包括堆栈溢出)上流行的原因。 WISIGIG 编辑器专为管理员/内部使用而设计,因为您不希望您的网站管理员注入(inject)不良内容。
自下而上的方法注定会失败。 HTML 清理程序面临指数级的复杂性,并且不保证任何事情。
编辑 1
你说是卫生问题,不是前端问题。我不同意,因为你不能处理所有现在和 future 的 HTML 实体,你最好在前端级别限制它以 100% 确定。
这就是说,也许以下是适合您的解决方案:
- 您可以通过剥离所有实体来清理您的代码
使用 PHP 的
strip_tags()
的白名单除外。 - 您还可以删除所有剩余的标签属性(属性)
通过使用 PHP 的
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=""属性。因此 [b-z][B-Z]
正则表达式。
关于php - 使用 PHP 清理 HTML5(防止 XSS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23455434/