有什么方法可以利用我的 HTML 安全程序吗?

Is there any way that my HTML securer could be exploited?

我终于设法创建了一个执行以下操作的函数:

  1. 将字符串作为输入。这可以是整个 HTML 文档或 HTML“片段”(甚至是损坏的)。
  2. 据此创建一个 DOM 文档并遍历所有节点。
  3. 每当它遇到其元素在基本结构元素白名单之外的任何节点时,它就会“将其标记为删除”。例如,<script> 未列入白名单。
  4. 只要任何节点具有任何以“on”开头的属性,就会立即用 removeAttribute 删除。这同样适用于任何“style”属性,以及任何值以“javascript:”开头的“href”属性。
  5. 当所有节点都循环遍历后,标记为删除的节点将循环遍历并删除($node->parentNode->removeChild($node))。这不是在第一个循环中完成的,因为如果你这样做,解析器会变得混乱。
  6. 此文档现已 saveHTMLed 并作为字符串返回,现在表示 cleaned/secured HTML document/snippet.

据我所知,没有办法滥用它。除非 DOM 解析器中有一些错误,这是我的 hands/conscience.

但也许还有另一个“onsomething”属性或其他我没有想到的东西?

我非常有信心从任何不受信任的 external/user-provided 源输出任何 HTML 后,在它被我的这个功能破坏后,但也许我太自大了?

(我真的希望 strip_tags 能自己完成,这样我就不必编写自己的代码了。)

如果要防止 xss,所有 on* 属性都可以删除。此外,style 在某些浏览器中可能以各种方式具有 javascript,以及 href (javascript:)。我认为SVG可以包括脚本等等。

查看 here 一个不全面的列表,其中列出了如何绕过这些消毒剂,以及为什么很难自己构建消毒剂。

为什么不直接使用像 Google Caja 这样的知名消毒剂,而不是重新发明它们?这比你想象的要难得多。