使用 str_replace 防止 php 注入上传的 HTML 内容

Use str_replace to prevent php injection in uploaded HTML content

当客户端上传HTML内容到服务器时,我会检查并删除PHP标签以防止PHP注入。我读了一些帖子,他们几乎说我应该使用 preg_replace (regx) 或者更好的是,我应该将 html 解析为 DOMDocument 对象。但是,我认为这种方法将花费服务器时间。

据我所知,普通用户(非恶意用户)永远不会在 html 内容中使用 php 标签 (<?php, ...)。如果他们想要显示 <?php,编辑器会将 < 转换为 &lt;。因此,对于带有html 注入的恶意用户,我使用str_replace 将所有php 标记更改为评论。例如:

$htmlStr = str_replace("?php", "<!--?php", htmlStr);
$htmlStr = str_replace("?>", "?-->", htmlStr);

与使用preg_replaceDOMDocument相比不会花费时间。我知道内容可能会受到影响(例如,如果缺少标签 ?>,所有内容都会转换为评论)。但是,它是恶意用户的内容。

这种方式有什么问题吗?我想的这么简单吗?

永远不要构建自己的反注入脚本实现,除非你真的知道你在做什么。

如果可能,阻止任何基于用户 HTML 的内容。如果不是,请使用现有解决方案,例如 HTML Purifier.