Node.js URL跳转

2021-06-01 10:05 更新

1.12.1【必须】限定跳转目标地址

  • 适用场景包括:

  1. 使用30x返回码并在Header中设置Location进行跳转
  2. 在返回页面中打印<script>location.href=__Redirection_URL__</script>

  • 使用白名单,限定重定向地址的协议前缀(默认只允许HTTP、HTTPS)、域名(默认只允许公司根域),或指定为固定值;

  1. // 使用express实现的登录成功后的回调跳转页面
  2. // bad: 未校验页面重定向地址
  3. app.get("/login", (req, res) => {
  4. // 若未登录用户访问其他页面,则让用户导向到该处理函数进行登录
  5. // 使用参数loginCallbackUrl记录先前尝试访问的url,在登录成功后跳转回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. // 若未登录用户访问其他页面,则让用户导向到该处理函数进行登录
  17. // 使用参数loginCallbackUrl记录先前尝试访问的url,在登录成功后跳转回loginCallbackUrl:
  18. const { loginCallbackUrl } = req.query;
  19. if (loginCallbackUrl && isValidUrl(loginCallbackUrl)) {
  20. res.redirect(loginCallbackUrl);
  21. }
  22. });
  23. // good: 白名单限定重定向地址,通过返回html实现
  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. // 若未登录用户访问其他页面,则让用户导向到该处理函数进行登录
  29. // 使用参数loginCallbackUrl记录先前尝试访问的url,在登录成功后跳转回loginCallbackUrl:
  30. const { loginCallbackUrl } = req.query;
  31. if (loginCallbackUrl && isValidUrl(loginCallbackUrl)) {
  32. // 使用encodeURI,过滤左右尖括号与双引号,防止逃逸出包裹的双引号
  33. const redirectHtml = `<script>location.href = "${encodeURI(loginCallbackUrl)}";</script>`;
  34. res.end(redirectHtml);
  35. }
  36. });

关联漏洞:中风险 - 任意URL跳转漏洞

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号