GirlsBoy
回首向来萧瑟处,归去,也无风雨也无晴。

  URL任意跳转漏洞,又叫开放重定向漏洞,是一种常见的安全漏洞。当访问时用widow.href或者window.localtion指定跳转地址时,会报此漏洞。

  网上的解决方案大致分为两种。

  方法一:种是对跳转URL进行加密,使用方法

        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('/')  
            };  
        } 

 

  此方法参考链接https://www.c-sharpcorner.com/article/preventing-open-redirection-attacks-in-c-sharp-and-javascript/

  方法二:修改方案为模拟a标签点击跳转,同时也需要对URL进行加密处理可生效。

function createAElement(url) {
    let a = document.createElement('a')//建立一个a标签
    let urlObj = new URL(url, window.location.href);
    let href = (encodeUrlParams(urlObj));
    a.setAttribute("href", href);
    a.setAttribute('target', "_self")//设置target属性,_blank打开新标签,_self在本标签打开// 模拟点击事件
    a.click();
    document.body.appendChild(a);
    a.remove();
}
function encodeUrlParams(url) {
    // 解析 URL
    let urlObj = new URL(url);
    // 获取查询参数
    let params = new URLSearchParams(urlObj.search);
    // 遍历查询参数
    for (let [key, value] of params.entries()) {
        params.delete(key);
        params.set(encodeURIComponent(key), encodeURIComponent(value));
    }
    // 更新 URL 的查询部分
    urlObj.search = params.toString();
    // 返回更新后的 URL
    return urlObj.href;
}

  使用方法二的处理方案,成功解决了fotify扫描的问题。

 

 
posted on 2024-08-12 21:14  GirlsBoy  阅读(11)  评论(0编辑  收藏  举报

java\web应用开发&研究

梦想程序改变生活

成为一个了不起的人