支持的语法
出于安全考虑,HTML 题的内容会经过白名单过滤:只保留受支持的标签、属性与样式,其余一律自动清除。保存时会先把 HTML 解析为语法树再重新序列化,因此不在白名单内的内容不会被渲染,也不会被保存。
支持的标签
仅支持以下标签:
| 类别 | 标签 |
|---|---|
| 基础 | div、p、span、em、h1 ~ h6 |
| 表格 | table、thead、tbody、th、td、colgroup、col |
| 交互 | button |
不在列表内的标签(如 script、img、iframe、a、input 等)都会被过滤掉。后续会持续支持一些标签。
支持的属性
所有标签通用允许的属性:class、id、style、title
部分标签额外允许的属性:
| 标签 | 额外允许的属性 |
|---|---|
td | colspan、rowspan、align、valign |
th | colspan、rowspan、align、valign、scope |
col / colgroup | span、width、align |
table | align、width |
其余属性(包括所有 on* 事件属性,如 onclick)都会被过滤。
style 的限制
style 属性被允许,但其中的**危险声明会被过滤**,以防引用外部资源或造成安全/隐私风险。被禁止的样式属性
以下属性会被整条丢弃:
| 类别 | 被禁止的属性 |
|---|---|
| 背景 | background、background-image |
| 遮罩 | mask、mask-image、mask-box-image、-webkit-mask、-webkit-mask-image、-webkit-mask-box-image |
| 边框 / 列表图片 | border-image、border-image-source、list-style-image |
| 滤镜 / 裁剪 | filter、-webkit-filter、backdrop-filter、clip-path |
| 定位 | position、top、right、bottom、left、inset、z-index |
| 浮动 | float、clear |
| 变换 | transform、translate、rotate、scale、perspective |
| 其他 | content、src、behavior、-moz-binding、binding、shape-outside、offset-path |
例如
background因为可以写url(...)引用外部图片,会被整体禁用;如需背景色请使用background-color。
定位、浮动、变换类属性能让内容脱离文档流、盖到题目范围之外。HTML 题只是问卷里的一道题,不允许它的内容遮挡其它题目或提交按钮,因此这几类属性一并禁用。排版请改用
margin、padding、display、flex、grid等属性。
被禁止的样式取值
取值里用到的 CSS 函数也走白名单:只允许颜色(rgb、rgba、hsl、hwb、lab、lch、oklab、oklch、color、color-mix)、数值计算(calc、min、max、clamp 等)、缓动(cubic-bezier、steps、linear)、渐变(linear-gradient、radial-gradient、conic-gradient 及其 repeating / 厂商前缀变体)、基本图形(circle、ellipse、inset、polygon、path 等)、网格(repeat、minmax、fit-content)与 var、env。不在白名单内的函数一律导致整条声明被丢弃,因此 url(...)、image-set(...)、cross-fade(...)、element(...)、expression(...) 这类会加载外部资源或执行脚本的写法天然被挡住。
此外,取值中命中以下片段时该条声明也会被丢弃:
| 类型 | 被禁止的片段 |
|---|---|
| 伪协议 | javascript:、vbscript:、livescript:、mocha:、data: |
| CSS 转义 | 反斜杠 \(如 exp\72 ession( 这类伪装写法) |
内联样式的正常写法用不到反斜杠转义(中文字体名直接写即可),出现即视为伪装,整条声明丢弃。
即:所有会加载外部资源或执行脚本的写法都不被允许。安全的排版类样式(如 color、font-size、text-align、margin、padding、background-color 等)可以正常使用。