我正在element.textContent = unescapedData
将非转义用户输入放在网站上。攻击者有什么方法可以用这个做坏事吗?
此外,攻击者是否有办法影响element
之外的页面(如30rem
3rem
之外的max-width: 30rem;
max-height: 3rem;
overflow: hidden;
框),如果它有以下css?
{{1}}
我考虑过使用奇怪或无效的Unicode字符,但无法找到有关如何完成此操作的任何信息。
答案 0 :(得分:6)
相关规范似乎在https://dom.spec.whatwg.org/#dom-node-textcontent。假设element
是Element或DocumentFragment,则创建Text节点并将其数据设置为字符串unescapedData
。
这个Is a DOM Text Node guaranteed to not be interpreted as HTML?似乎非常明确,浏览器不会将Text节点呈现为除文本之外的任何内容。我还没有在规范中追踪到这一点。
因此,除非浏览器有缺陷,否则答案是"否"和"不"。
答案 1 :(得分:3)
.textContent设置的纯文本在脚本元素之外不可执行,其中.type设置为text / javascript。
建议在表单中的输入元素处使用带有适当RegEx的模式属性来解决潜在问题。
答案 2 :(得分:0)
这取决于。
根据OWASP DOM based XSS Prevention Cheat Sheet的规则#6:
使用不受信任的数据填充DOM的最基本安全方法是使用安全分配属性textContent。
因此,在大多数情况下,unescapedData
将被解释为文本(而不是代码)并呈现为:
element.textContent = unescapedData
我知道的唯一例外是在设置textContent
元素的<script>
属性时。它将被解释为代码:
const element = document.createElement('script');
const unescapedData = 'alert("xss is possible here")';
element.textContent = unescapedData;
document.body.appendChild(element);
您可以在关于article的trusted-types中看到,textContent
元素的<script>
属性被认为是危险的接收器,将触发违反内容安全策略的行为。 / p>