php - 使用 PHP 清理 HTML5(防止 XSS)

标签 php html xss wysiwyg sanitize

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

保护站点免受跨站点脚本 (XSS) 侵害等基本任务正在​​成为一项艰巨的任务,因为没有适用于 PHP 的最新净化和过滤软件。

HTML Purifier 目前不支持 HTML5,整体状态看起来非常糟糕(短期内不会支持 HTML5)。

那么我应该如何使用 PHP(后端)清理不受信任的 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% 确定。

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

  1. 您可以通过剥离所有实体来清理您的代码 使用 PHP 的 strip_tags() 的白名单除外。
  2. 您还可以删除所有剩余的标签属性(属性) 通过使用 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/

相关文章:

php - Symfony 2 - 从控制台命令调用 Controller 方法

PHP 速记加法运算符 - undefined offset

html - alt =""在某些情况下是否适用于 html img 标签?

java - 如何清理 HTML 用户输入并删除所有可能的脚本?

php - 使用 Laravel 查询生成器进行嵌套选择

使用 IN 时,php mysql 查询匹配表中的所有行

javascript - .blur() 声音通知

html - 在边框后面显示文本

javascript - 使用javascript重定向到当前域之外

javascript - JavaScript 实体解码然后编码的安全隐患