我有一个网页,其初始页面加载时会显示一些用户内容。有一个按钮可以触发进一步的页面加载(有点像Twitter的无限滚动)。呈现原始页面的Django模板也用于呈现无限滚动(部分视图)的内容。服务器通过AJAX发送格式化的HTML,可以很容易地插入我现有的页面,如下所示:
$(new-Html).insertAfter($('existing-content'))
使用此选项,我可以重复使用现有模板来呈现我的内容。是否值得方便,我可以假设在Django的末尾逃避我的XSS吗?正是这个jQuery ticket让我担心。将所有HTML填充到选择器$(..)
或者,我应该使用JSON作为响应类型并使用jQuery将所有用户内容精心编写为文本节点吗?这是一项更多的工作和由于我将在很大程度上复制模板渲染,因此容易出错。即使这条路线出现更安全,但很难维护两种冗余的渲染方法,一种是通过模板,另一种是通过JS。
更新:我考虑过使用其中一条评论中建议的innerHTML但不确定:http://www.slideshare.net/x00mario/the-innerhtml-apocalypse(mXSS上的Mario Heiderich)
答案 0 :(得分:0)
呈现原始页面的Django模板也用于呈现无限滚动(部分视图)的内容。
因此你很安全。如果你正在做的只是呈现你已经控制并且已经信任你的初始页面加载的内容,那么页面源中将没有任何恶意呈现。在这种情况下,当您从一个受信任的源加载时,如果有任何恶意代码被渲染会导致XSS,那么这将是提供源的AJAX服务的问题,而不是呈现它的JQuery。< / p>
您所引用的票证与XSS WITH $(LOCATION.HASH) AND $(#<TAG>)
有关,与您正在执行的操作不同(并且还标记为已修复)。
答案 1 :(得分:-1)
<强>更新强>
在将HTML传递给jQuery之前使用此行,它将删除HTML中包含的任何脚本(包括onmouseover等):
var cleansed = str.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gmi, "");
cleansed = cleansed.replace(/\bon\w+\s*=[\s\S]*?>/gmi, ">");
我仍然说jQuery / Django方法是理想的方法。在将脚本添加到DOM之前,上面的行将清除脚本的内容。
<强>上强>
Django应该逃避它进入jQuery那一行的任何事情。只要您不在任何地方使用eval()语句,跨站点脚本就不应该成为一个问题。我说你继续前进的方式更实际。