我应该只对纯文本形式的不需要数据还是由js变量持有的不需要数据使用encodeForJavascript吗?

时间:2018-10-18 08:13:03

标签: javascript html-parsing url-encoding esapi

我们的项目最近被发现具有基于DOM的XSS攻击漏洞。我使用可用的文档进行了研发,即 1. https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet 2. https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet 我正在尝试使用ESAPI修复以下代码行

for(var i = 0; i < listOfLinks.length; i++) {
$("#listOfLinks").append('<li><a href="' + $("#baseUrl").val() + listOfLinks[i].URL + '" onclick="linkClicked(\'' + listOfLinks[i].URL + '\',\'' + listOfLinks[i].DisplayName + '\', event)">' + listOfLinks[i].DisplayName + '</a></li>');
}

所以新代码如下所示

for(var i = 0; i < listOfLinks.length; i++) {
var li = document.createElement('li');
var a = document.createElement('a');
var url = $("#baseUrl").val() + listOfLinks[i].URL;
a.setAttribute("href", $ESAPI.encoder().encodeForJavaScript($ESAPI.encoder().encodeForURL(url)));
a.onclick = linkClicked.bind(this, listOfLinks[i].URL, listOfLinks[i].DisplayName]);
a.innerText = listOfLinks[i].DisplayName;
li.appendChild(a);
$("#recentlyUsedModules").append(li);
}

此解决方案背后的想法是,任何HTML操作都应使用诸如createElement,setAttribute之类的js函数来完成。

使用a.setAttribute(“ href”)时遇到问题,如果我的URL是“ \ link-name”,则用户将重定向到/ x2Flink / x2Dname,从而找不到页面。这里的问题是javascript编码不会反转。

所以我的问题是,我在这里使用ESAPI错误吗?我可以清楚地看到https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet中的第5条规则指出,使用setAttribute设置href时,我们需要先进行Url编码,再进行JS编码。为什么JS解析器无法反转javascript编码?

0 个答案:

没有答案