如何在JavaScript中保护location.href免受跨站脚本攻击?

7
在我的JavaScript函数中,我使用了如下的location.href: location.href = "../Floder1/result.jsp";它能够正常工作,但是当我使用Fortify工具时,它提示存在跨站脚本攻击(Cross-site Scripting),可能导致浏览器执行恶意代码。请问有什么方法可以防止这种跨站脚本攻击吗?非常感谢您的帮助。

你设置的 location.href 字符串是从哪里来的? - kinakuta
将值分配给location.href是错误的方法吗?如果是,请指导我。 - tajMahal
@Gabs00,flag 没有任何作用,只是为了标识/验证而保留的。 - tajMahal
@kinakuta,我认为这个字符串来自于Cookies。 - tajMahal
我参考了这个链接的第二个答案,但是我不知道如何将其实现到我的当前需求中。 - tajMahal
显示剩余2条评论
2个回答

1

这段代码只能在Firefox浏览器中运行,因为Proxy并不支持所有浏览器。

你可以用代理对象替换原始的location对象,在代理中添加一些逻辑来检查允许的location值。这样做不能保护原始对象(location)被直接修改,但如果你的代码只使用代理对象,那么应该没问题。

// suppose we are in example.com
let validator = {
   set: function(obj, prop, val) {
     if (prop === 'href') {
       if(typeof val != 'string'){
         throw new TypeError('href must be string.');
       }
       if (!val.startsWith("https://example.com/")) {
         throw new Error('XSS');
       }
     }
    obj[prop] = val;
    return true;
   },
   get: function(obj, prop){
    return prop in obj?
        obj[prop] :
        null;
   }
};
let proxiedLocation = new Proxy(location, validator);
console.log(proxiedLocation.href);// work same as location.href
proxiedLocation.href = "https://example.com/page1";// work fine
proxiedLocation.href = "https://example.net/page1";// cause exception

0

跨站脚本攻击发生在用户可以将数据放入网页或获取会话数据的情况下。

如何保护

永远不允许在您的网页中注入代码。因此,如果您有一个表单,请在服务器上检查它并在打印到页面之前解析它。

您不应该允许href更改页面内容。您始终要在escape数据之前进行处理!

阅读有关location.href的答案:https://dev59.com/tWAf5IYBdhLWcg3w_G2r#24089350

示例

您有一个iframe,它随着GET变量而改变:

sample.tld/index.jsp?iframe=none.jsp

我可以向您的 iframe 注入一个 script,因此您应该使用转义字符来保护它:

// Escape the characters in the server and send it to the client.
// So the variable GET iframe will be valid

我应该如何编写条件来保护我的当前情况(问题)? - tajMahal
蛇,我在我的代码中没有使用任何iframe,只是在我的js函数中有这段代码location.href = "../Floder1/result.jsp"; - tajMahal
1
哪里出了问题?这些 location.href 重定向到另一个页面。这不是漏洞。如果 Fortify 工具 表示这些行是 XSS 漏洞,那么它是错误的。阅读此解释 - SnakeDrak
如果它解决了你的问题,请标记一下:)。否则告诉我你想做什么。问候! - SnakeDrak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接