无引号或HTML标签的场景下是否存在XSS跨站脚本攻击风险?
问题结论:当前场景下无法直接触发XSS
你给出的前提(所有HTML标签、引号被完全剥离或转义为十六进制格式)成立的情况下,不存在直接的XSS触发风险,原因如下:
- ERB渲染
<input>的value属性时,没有可用的字符可以突破属性上下文:闭合属性需要单/双引号,你已经做了完全的转义或剥离,无法跳出value属性构造额外的HTML标签或属性,不存在HTML注入基础。 - 前端读取的是
<input>的value属性值,属于纯文本类型,传入Konva.Text的text和color参数时,Konva会将其作为纯文本内容绘制到Canvas上,不会对内容做JS解析或HTML解析,即使用户输入了原生JS、十六进制编码的JS内容,也只会被当做普通文字渲染,不会执行。
这套实现方案仍存在的安全隐患
- 上下文切换风险:你当前的 sanitize 规则只适配了HTML属性渲染的场景,如果后续有业务迭代把这些用户输入用到其他上下文,就会触发风险:
- 如果将输入赋值给
onclick/onload等事件属性、href/src/background等支持javascript:协议的属性,哪怕没有引号,也可以构造javascript:alert(1)这类内容执行JS。 - 如果后续支持Konva导出为SVG文件,用户输入的内容如果包含
<script>标签,SVG文件被打开时会直接执行嵌入的JS代码。 - 如果将输入直接插入到CSS样式中,可构造CSS注入,比如利用旧IE的
expression语法、或者构造样式窃取页面内的CSRF Token等敏感信息。
- 如果将输入赋值给
- sanitize规则本身的可靠性风险:你提到的“完全剥离或转义HTML标签和引号”需要确保没有边界case遗漏,比如是否处理了全角引号、多种编码的引号?如果规则存在疏漏,仍然有突破属性上下文的可能。
相关问题补充
支持内联JS执行的HTML属性
- 所有事件类属性:
onclick、onload、onerror、onmouseover、oninput等所有on开头的属性,值会被当做JS执行。 - 支持协议解析的属性:
href、src、background、action、formaction、location等,当值以javascript:、vbscript:(旧IE)协议开头时,触发对应行为就会执行脚本。 - 特殊属性:
iframe的srcdoc、style属性值(部分浏览器支持expression、javascript:形式的CSS表达式)、SVG的href/onload等专属属性。
除了eval之外自动执行字符串为JS的场景
- 定时器函数:
setTimeout(用户输入, 延迟)、setInterval(用户输入, 延迟),第一个参数传入字符串时会自动解析为JS执行。 - 函数构造器:
new Function(用户输入)()会将传入的字符串作为函数体执行。 - 地址赋值:
location.href = 用户输入、window.open(用户输入),如果值为javascript:协议开头会直接执行。 - DOM赋值:将用户输入赋值给
innerHTML、outerHTML、document.write()时,如果内容包含带事件属性的标签、SVG脚本等内容,会自动执行对应JS。 - 动态导入:
import(用户输入)如果用户输入可控也会产生风险。
内容的提问来源于stack exchange,提问作者Peter P.
相关产品推荐
相关产品推荐

