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掃描的問題。