富文本里可以允许的 HTML 属性
一、所有标签默认允许的安全属性(极少)
class (可选)
id (通常建议禁用)
title
️ 注意:
id容易被滥用做锚点注入,很多系统直接禁用class允许的话最好只允许固定前缀(如editor-*)
二、a 标签允许属性
<a href="" title="" target="" rel="">
允许
| 属性 | 说明 |
|---|---|
| href | 必须过滤协议 |
| title | 安全 |
| target | 只允许 _blank |
| rel | 推荐强制添加 |
必须校验 href 协议
只允许:
http
https
mailto
必须拒绝:
javascript:
data:
vbscript:
file:
并建议自动添加:
rel="nofollow noopener noreferrer"
target="_blank"
三、img 标签允许属性
<img src="" alt="" width="" height="" loading="">
允许
| 属性 | 说明 |
|---|---|
| src | 必须过滤协议 |
| alt | 推荐保留 |
| width | 只允许数字 |
| height | 只允许数字 |
| loading | 可固定为 lazy |
必须删除
onerror
onload
style
srcset (如不支持)
src 协议限制
允许:
http
https
通常建议:
禁止 data: (避免 base64 注入)
四、table 标签属性
<table>
<tr>
<td>
<th>
一般只允许:
colspan
rowspan
必须验证:
必须是整数
五、pre / code
通常无需额外属性。
如果你做代码高亮:
<code class="language-php">
建议:
只允许
class且 class 必须匹配:
/^language-[a-z0-9]+$/
六、绝对必须删除的属性(所有标签)
style
onclick
onerror
onload
onmouseover
on*
formaction
xlink:href
xmlns
可以用规则:
if (preg_match('/^on/i', $attrName)) {
remove
}
七、是否允许 style?
生产环境建议:
不允许 style
原因:
<div style="background:url(javascript:alert(1))">
CSS 也可以 XSS。
如果一定要允许:
必须做 CSS 级别过滤(非常复杂)
不建议自己实现
八、SVG 属性全部禁止
如果允许 <svg>,几乎无法安全控制。
建议:
直接删除 svg
九、推荐最终安全属性白名单(实战版)
$allowedAttributes = [
'a' => ['href', 'title', 'target', 'rel'],
'img' => ['src', 'alt', 'width', 'height', 'loading'],
'td' => ['colspan', 'rowspan'],
'th' => ['colspan', 'rowspan'],
'code' => ['class'],
'*' => ['class', 'title']
];
十、生产级安全规则总结
| 项目 | 建议 |
|---|---|
| style | 禁止 |
| on* 事件 | 全部删除 |
| javascript: | 禁止 |
| data: | 通常禁止 |
| svg | 删除 |
| iframe | 删除 |
十一、最佳实践(不要自己写正则)
如果你是生产环境:
推荐:
使用 Symfony HtmlSanitizer
或 HTMLPurifier
它们已经处理了:
URI 过滤
CSS 过滤
XSS 规则
HTML5 规范