.textContent完全安全吗?

时间:2017-03-23 22:12:45

标签: javascript css security escaping

我正在element.textContent = unescapedData将非转义用户输入放在网站上。攻击者有什么方法可以用这个做坏事吗?

此外,攻击者是否有办法影响element之外的页面(如30rem 3rem之外的max-width: 30rem; max-height: 3rem; overflow: hidden; 框),如果它有以下css?

{{1}}

我考虑过使用奇怪或无效的Unicode字符,但无法找到有关如何完成此操作的任何信息。

3 个答案:

答案 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中看到,textContent元素的<script>属性被认为是危险的接收器,将触发违反内容安全策略的行为。 / p>