我正在尝试清理我的代码以解决所有Open Redirect漏洞。对于我的所有c#代码,我应用了一个修复程序来检查提供给Response.Redirect的URL是否来自与应用程序相同的域。如果没有,则抛出异常。
我的问题是关于我的.js代码中的打开重定向实例。标记为易受攻击的代码是:
window.open('Help/Admin/webhelp/' + helpFile, '_blank', 'toolbar=no, menubar=no, status=yes, scrollbars=yes, resizable=yes');
httpReqObject.open("GET", 'GetHelpLink.ashx?modid=' + _AdminHelpContext, true);
window.open('viewcontents.aspx?did=' + grid.rows[i].cells[gridCell.docID].innerText, "toobar=0,menubar=0,resizable=1")
在我的javascript代码中解决此Open Redirect漏洞的最佳方法是什么?
感谢。
答案 0 :(得分:3)
以下是我提出的解决此问题的方法。我同意这不是最优雅的解决方案之一,可能需要一些改进,但它确实满足了我不允许用户导航到应用程序域之外的URL的基本要求:
function LaunchHelp(surl) {
try {
if (validateURL(surl))
window.open(surl, '_blank', 'toolbar=no,menubar=no,status=yes');
else {
throw new InvalidURLException();
}
} catch (e) {
if (e instanceof InvalidURLException)
alert(e.message);
}
}
function InvalidURLException() {
this.message = "An attempt was made to open a webpage of foreign domain. No allowed.";
this.toString = function() {
return this.message
};
}
function validateURL(surl) {
var url = parseURL(surl);
var urlHostname = url.hostname.trim();
if (urlHostname == '') {
return true;
}
else {
if (urlHostname.toUpperCase() == location.hostname.trim().toUpperCase()) {
return true;
}
else
return false;
}
}
function parseURL(url) {
var a = document.createElement('a');
a.href = url;
return {
source: url,
protocol: a.protocol.replace(':', ''),
hostname: a.hostname,
host: a.host,
port: a.port,
query: a.search,
params: (function () {
var ret = {},
seg = a.search.replace(/^\?/, '').split('&'),
len = seg.length, i = 0, s;
for (; i < len; i++) {
if (!seg[i]) { continue; }
s = seg[i].split('=');
ret[s[0]] = s[1];
}
return ret;
})(),
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
hash: a.hash.replace('#', ''),
path: a.pathname.replace(/^([^\/])/, '/$1'),
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
segments: a.pathname.replace(/^\//, '').split('/')
};
}
我必须检查主机名为空字符串,以便为LaunchHelp方法提供相对路径('Help / Admin / webhelp /')。在这种情况下,parseURL返回一个空白主机名。我从here偷了“parseURL”方法。
欢迎任何建议/意见/问题。