【发布时间】:2021-03-03 13:38:56
【问题描述】:
我终于设法制作了一个执行以下操作的函数:
- 将字符串作为输入。这可以是整个 HTML 文档,也可以是 HTML“sn-p”(甚至损坏)。
- 由此创建一个 DOMDocument 并遍历所有节点。
- 每当遇到其元素在基本结构元素白名单之外的任何节点时,它都会“将其标记为删除”。例如,
<script>未列入白名单。 - 每当任何节点具有以“on”开头的任何属性时,都会立即使用
removeAttribute将其删除。任何“style”属性以及任何值以“javascript:”开头的“href”属性也是如此。 - 当所有节点都循环通过时,标记为删除的节点会循环并删除(
$node->parentNode->removeChild($node))。这不是在第一个循环中完成的,因为如果您这样做,解析器会变得混乱。 - 此文档现在是
saveHTMLed 并以字符串形式返回,现在表示已清理/安全的 HTML 文档/sn-p。
据我所知,没有办法滥用它。除非 DOM 解析器中存在一些错误,否则我将无法使用/良心。
但也许还有另一个“onsomething”属性或其他我没有想到的东西?
在任何不受信任的外部/用户提供的源被我的这个功能破坏后,我对从任何不受信任的外部/用户提供的源输出任何 HTML 非常有信心,但也许我很自大?
(我真的希望 strip_tags 能够自己完成这项工作,这样我就不必编写自己的代码了。)
【问题讨论】:
标签: php html security html-parsing domdocument