Node.js URL跳轉(zhuǎn)

2021-06-01 10:05 更新

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

  • 適用場(chǎng)景包括:

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

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

  1. // 使用express實(shí)現(xiàn)的登錄成功后的回調(diào)跳轉(zhuǎn)頁(yè)面
  2. // bad: 未校驗(yàn)頁(yè)面重定向地址
  3. app.get("/login", (req, res) => {
  4. // 若未登錄用戶訪問(wèn)其他頁(yè)面,則讓用戶導(dǎo)向到該處理函數(shù)進(jìn)行登錄
  5. // 使用參數(shù)loginCallbackUrl記錄先前嘗試訪問(wèn)的url,在登錄成功后跳轉(zhuǎn)回loginCallbackUrl:
  6. const { loginCallbackUrl } = req.query;
  7. if (loginCallbackUrl) {
  8. res.redirect(loginCallbackUrl);
  9. }
  10. });
  11. // good: 白名單限定重定向地址
  12. function isValidURL(sUrl) {
  13. return !!((/^(https?:\/\/)?[\w\-.]+\.(qq|tencent)\.com($|\/|\\)/i).test(sUrl) || (/^[\w][\w/.\-_%]+$/i).test(sUrl) || (/^[/\\][^/\\]/i).test(sUrl));
  14. }
  15. app.get("/login", (req, res) => {
  16. // 若未登錄用戶訪問(wèn)其他頁(yè)面,則讓用戶導(dǎo)向到該處理函數(shù)進(jìn)行登錄
  17. // 使用參數(shù)loginCallbackUrl記錄先前嘗試訪問(wèn)的url,在登錄成功后跳轉(zhuǎn)回loginCallbackUrl:
  18. const { loginCallbackUrl } = req.query;
  19. if (loginCallbackUrl && isValidUrl(loginCallbackUrl)) {
  20. res.redirect(loginCallbackUrl);
  21. }
  22. });
  23. // good: 白名單限定重定向地址,通過(guò)返回html實(shí)現(xiàn)
  24. function isValidURL(sUrl) {
  25. return !!((/^(https?:\/\/)?[\w\-.]+\.(qq|tencent)\.com($|\/|\\)/i).test(sUrl) || (/^[\w][\w/.\-_%]+$/i).test(sUrl) || (/^[/\\][^/\\]/i).test(sUrl));
  26. }
  27. app.get("/login", (req, res) => {
  28. // 若未登錄用戶訪問(wèn)其他頁(yè)面,則讓用戶導(dǎo)向到該處理函數(shù)進(jìn)行登錄
  29. // 使用參數(shù)loginCallbackUrl記錄先前嘗試訪問(wèn)的url,在登錄成功后跳轉(zhuǎn)回loginCallbackUrl:
  30. const { loginCallbackUrl } = req.query;
  31. if (loginCallbackUrl && isValidUrl(loginCallbackUrl)) {
  32. // 使用encodeURI,過(guò)濾左右尖括號(hào)與雙引號(hào),防止逃逸出包裹的雙引號(hào)
  33. const redirectHtml = `<script>location.href = "${encodeURI(loginCallbackUrl)}";</script>`;
  34. res.end(redirectHtml);
  35. }
  36. });

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)