做网站时,用户提交的内容总少不了带标签。比如在博客评论里加个<strong>加粗文字</strong>,或者论坛发帖时用<img src="xxx">插张图。但放任不管的话,可能有人偷偷插入恶意脚本,轻则页面错乱,重则安全出问题。
为什么需要标签审核
你家楼下便利店不会随便让陌生人进仓库,网站也一样。用户输入的HTML标签就像外来物品,得检查清楚才能放行。比如有人提交这段内容:
<script>alert('劫持成功')</script>
如果不处理,这段代码就会在别人打开页面时执行,可能盗取登录信息。所以得定好规则,哪些标签能留,哪些必须删或转义。
常见允许的标签类型
大多数内容平台会保留基础排版标签,比如:
- <b>、<strong>:加粗
- <i>、<em>:斜体
- <a href="...">:链接(注意只允许http和https)
- <br>:换行
- <p>:段落
- <img src="...">:图片(但要限制域名,防止外链滥用)
过滤策略怎么写
实际开发中,可以用正则或专用库来清理。比如PHP里用strip_tags()函数,但要注意它只能简单过滤,不能处理嵌套或属性注入。更稳妥的方式是白名单机制:
// 示例:只允许特定标签
$allowed_tags = '<a href="https://" rel="nofollow"><br><p><strong><em><img src="https://trusted-cdn.com">';
$clean_content = strip_tags($user_input, $allowed_tags);
如果是Node.js项目,可以用DOMPurify这类库:
const DOMPurify = require('isomorphic-dompurify');
let clean = DOMPurify.sanitize(dirtyString);
属性也不能忽视
光放行标签还不够。比如<img src="javascript:alert(1)">这种,看着像图片,实则执行脚本。所以对src、href、onerror这些属性要特别检查,禁止javascript:协议,过滤掉onmouseover这类事件。
实际场景举例
你做个本地生活社区,用户可以发帖分享餐馆体验。有人想贴张美食图,正常写法是:
<img src="https://cdn.foodie.com/123.jpg" alt="红烧肉">
系统按规则放行。但如果他改成:
<img src="x" onerror="fetch('/steal-cookie?c='+document.cookie)">
这种就得被过滤掉,否则其他浏览帖子的人cookie可能被偷走。
定期检查规则更新
浏览器支持的新标签一直在变,攻击手法也在升级。比如以前不常见的<svg>标签,现在也能藏恶意代码。建议每半年 review 一次你的审核规则,参考主流框架如WordPress或Discourse的做法,保持防护不过时。