Node.js URL跳轉(zhuǎn)

2021-06-01 10:05 更新

1.12.1【必須】限定跳轉(zhuǎn)目標地址

  • 適用場景包括:

  1. 使用30x返回碼并在Header中設(shè)置Location進行跳轉(zhuǎn)
  2. 在返回頁面中打印<script>location.href=__Redirection_URL__</script>

  • 使用白名單,限定重定向地址的協(xié)議前綴(默認只允許HTTP、HTTPS)、域名(默認只允許公司根域),或指定為固定值;

// 使用express實現(xiàn)的登錄成功后的回調(diào)跳轉(zhuǎn)頁面


// bad: 未校驗頁面重定向地址
app.get("/login", (req, res) => {
    // 若未登錄用戶訪問其他頁面,則讓用戶導向到該處理函數(shù)進行登錄
  // 使用參數(shù)loginCallbackUrl記錄先前嘗試訪問的url,在登錄成功后跳轉(zhuǎn)回loginCallbackUrl:
    const { loginCallbackUrl } = req.query;
    if (loginCallbackUrl) {
        res.redirect(loginCallbackUrl);
    }
});


// good: 白名單限定重定向地址
function isValidURL(sUrl) {
    return !!((/^(https?:\/\/)?[\w\-.]+\.(qq|tencent)\.com($|\/|\\)/i).test(sUrl) || (/^[\w][\w/.\-_%]+$/i).test(sUrl) || (/^[/\\][^/\\]/i).test(sUrl));
}
app.get("/login", (req, res) => {
    // 若未登錄用戶訪問其他頁面,則讓用戶導向到該處理函數(shù)進行登錄
  // 使用參數(shù)loginCallbackUrl記錄先前嘗試訪問的url,在登錄成功后跳轉(zhuǎn)回loginCallbackUrl:
    const { loginCallbackUrl } = req.query;
    if (loginCallbackUrl && isValidUrl(loginCallbackUrl)) {
        res.redirect(loginCallbackUrl);
    }
});


// good: 白名單限定重定向地址,通過返回html實現(xiàn)
function isValidURL(sUrl) {
    return !!((/^(https?:\/\/)?[\w\-.]+\.(qq|tencent)\.com($|\/|\\)/i).test(sUrl) || (/^[\w][\w/.\-_%]+$/i).test(sUrl) || (/^[/\\][^/\\]/i).test(sUrl));
}
app.get("/login", (req, res) => {
    // 若未登錄用戶訪問其他頁面,則讓用戶導向到該處理函數(shù)進行登錄
  // 使用參數(shù)loginCallbackUrl記錄先前嘗試訪問的url,在登錄成功后跳轉(zhuǎn)回loginCallbackUrl:
    const { loginCallbackUrl } = req.query;
    if (loginCallbackUrl && isValidUrl(loginCallbackUrl)) {
        // 使用encodeURI,過濾左右尖括號與雙引號,防止逃逸出包裹的雙引號
        const redirectHtml = `<script>location.href = "${encodeURI(loginCallbackUrl)}";</script>`;
        res.end(redirectHtml);
    }
});

關(guān)聯(lián)漏洞:中風險 - 任意URL跳轉(zhuǎn)漏洞

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號