ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Node.js Best Practices 安全实践:如何彻底封堵不安全的重定向(Unsafe Redirects)

Node.js Best Practices 安全实践:如何彻底封堵不安全的重定向(Unsafe Redirects) 文档教程后端【免费下载链接】nodebestpractices✅ The Node.js best practices list (July 2026)项目地址https://gitcode.com/GitHub_Trending/no/nodebestpractices点击查看免费下载导读开放重定向Open Redirect是 Node.js/Express 应用中极易被忽视、却危害极大的安全漏洞攻击者利用未经验证的用户输入构造跳转目标将受害者引导到仿冒站点从而实施钓鱼、凭证窃取等攻击。本篇指南围绕本仓库 sections/security/saferedirects.polish.md 的实践条目对应 README.polish.md 中的 6.24 节归类于 OWASP A1: Injection 威胁类别先剖析不安全重定向的成因与攻击路径再给出服务端输入校验 白名单 相对路径限制三层可落地的防御方案。读完本文你将能够在自己的 Express 项目中写出经得起攻击者考验的重定向逻辑。为什么重定向会成为安全漏洞重定向本身是合法的业务行为——登录成功后跳回原页面、支付完成后回到商城、短链服务解析目标地址等场景都离不开它。问题不在于重定向而在于跳转目标是否经过了服务端校验。该实践条目明确指出当在 Node.js 和/或 Express 中实现重定向时必须在服务端对输入进行校验。如果攻击者发现你的应用没有校验外部用户提供的输入他们就可以在论坛、社交媒体等公开场所发布精心构造的链接引诱用户点击从而利用这一漏洞。这类攻击之所以危险是因为恶意链接的域名前缀往往还是你自己的站点例如https://your-site.com/login?urlhttps://evil.example用户在地址栏看到熟悉的域名后毫无戒心一旦跳转便进入攻击者的地盘。不安全示例直接信任req.query.url原始文档给出的反面示例非常典型——登录成功后直接以查询参数url作为重定向目标const express require(express); const app express(); app.get(/login, (req, res, next) { if (req.session.isAuthenticated()) { res.redirect(req.query.url); } });这段代码的致命点在于req.query.url完全由客户端控制服务端没有做任何校验。攻击者只需构造如下链接https://your-site.com/login?urlhttps://evil.example/phishing-page受害者登录后会被毫无防备地跳转到evil.example——一个可能高度模仿你站点的钓鱼页面。正如该实践引用的一位博主所述如果服务端重定向逻辑不校验进入url参数的数据用户最终可能到达一个看起来和你的站点一模一样如 examp1e.com但实际上在为黑客的需求服务的站点。修复思路一从根本上不依赖用户输入安全修复的第一步也是最彻底的一步避免依赖用户输入作为跳转依据。这一点在文档原文和多位安全博主的观点中高度一致——针对该漏洞的缓解方法相当直接不要把未经校验的用户输入作为重定向的基础。具体落地时可以通过以下方式消除用户输入重定向目标由服务端业务逻辑决定如固定的路由名、常量 URL而非由请求参数决定需要记住来源页面时改用服务端会话存储中由服务端写入的值而不是客户端回传的参数如果协议上必须传递参数应使用难以伪造的令牌或由服务端生成的引用 ID而不是裸 URL。修复思路二安全重定向白名单 相对路径校验当业务确实必须接受用户输入时文档给出的推荐做法是使用安全重定向白名单safe redirect whitelist避免暴露漏洞。完整示例代码如下const whitelist { https://google.com: 1 }; function getValidRedirect(url) { // check if the url starts with a single slash if (url.match(/^\/(?!\/)/)) { // Prepend our domain to make sure return https://example.com url; } // Otherwise check against a whitelist return whitelist[url] ? url : /; } app.get(/login, (req, res, next) { if (req.session.isAuthenticated()) { res.redirect(getValidRedirect(req.query.url)); } });这段防御代码的核心逻辑可以拆解为三个层次相对路径放行url.match(/^\/(?!\/)/)判断输入是否以单个斜杠开头/后不能紧跟另一个/。如果是说明这是一个站内相对路径如/dashboard此时拼接上自己的域名https://example.com后返回。这里用(?!\/)负向前瞻排除//evil.com这类协议相对 URL——攻击者常利用//让浏览器自动沿用当前协议并跳转到外部主机必须显式拦截。精确白名单匹配若输入不是站内相对路径则查表whitelist[url]只有完全命中的域名才被放行。whitelist中的键必须是完整、精确的 URL 字符串如https://google.com不允许使用包含通配符、子串匹配或以某域名开头的宽松判断——否则攻击者可以用https://google.com.evil.example之类的变体绕过。默认安全回退既不是合法相对路径、又不在白名单中的输入一律回退到站内首页/。任何不在白名单上的输入都不应被原样用于跳转这是白名单方案的安全底线。防御纵深在路由层提前拦截非法输入除了在重定向逻辑处做校验本仓库的安全实践还强调校验应尽早执行。参见 sections/security/validation.md建议使用 Express 中间件在请求进入路由处理器之前就校验请求体/参数对不符合预期的输入快速失败fail fast。把这一思想应用到重定向场景可以进一步缩小攻击面——非法url参数在进入业务逻辑之前就被 400 拒绝function validateRedirectParam(req, res, next) { const url req.query.url; if (url !/^\/(?!\/)/.test(url) !isWhitelisted(url)) { return res.status(400).send(Invalid redirect target); } next(); } app.get(/login, validateRedirectParam, (req, res, next) { if (req.session.isAuthenticated()) { res.redirect(getValidRedirect(req.query.url)); } });将校验下沉为中间件使得所有依赖该参数的路由都能复用同一套防御规则避免这处修了、那处又漏了的维护死角。常见误区与注意事项不要只做前缀/包含判断url.startsWith(https://example.com)无法抵御https://example.com.evil.io之类的绕过白名单必须精确匹配。警惕//协议相对 URL//evil.com会被浏览器按当前协议解析为外部主机正则中的(?!\/)就是为了排除它同时也要考虑javascript:、data:等非 HTTP 协议的输入统一交给白名单兜底。回退地址必须是常量默认回退/应是硬编码的站内路径不能是默认为上一个请求的 referer之类的可变值。校验必须发生在服务端前端 JavaScript 的校验只是用户体验攻击者可以直接构造 HTTP 请求绕过服务端校验不可省略。小结围绕阻止不安全重定向这一实践条目防御要点可归纳为一条主线与两层防线主线是服务端必须校验所有参与重定向的用户输入第一层防线是尽可能不依赖用户输入第二层防线是当必须使用时采用单斜杠相对路径 精确白名单 默认回退的组合策略。配合 README.polish.md 6.24 节中未校验的重定向可能让攻击者实施钓鱼、窃取用户凭证及其他恶意行为的风险提示将上述代码模式纳入你的路由实现即可有效消除这一 OWASP A1 类别下的常见漏洞。赞分享文档教程后端【免费下载链接】nodebestpractices✅ The Node.js best practices list (July 2026)项目地址https://gitcode.com/GitHub_Trending/no/nodebestpractices点击查看免费下载相关推荐listmonk 如何把活动邮件发布为公开订阅表单页面并嵌入网站listmonk 如何把活动邮件发布为公开订阅表单页面并嵌入网站 如果你用 listmonk 发送过 newsletter 活动邮件想把这些邮件变成不需要登录文档教程后端BrowserSkill发布流水线解析3条流水线实现自动化Release与Chrome/Edge商店自动上架指南BrowserSkill发布流水线解析3条流水线实现自动化Release与Chrome/Edge商店自动上架指南 BrowserSkill 是一款让 AI 智人工智能AI 应用AI 技能浏览器控制dsh-pluginFront-End-Checklist 新标签页安全指南用 relnoopener noreferrer 彻底封堵反向 Tabnabbing 攻击Front End Checklist 新标签页安全指南用 relnoopener noreferrer 彻底封堵反向 Tabnabbing 攻击 在上一篇如何解决开源项目airpaste的8个常见问题完整故障排除指南下一篇如何快速掌握迁移学习PythonDataScienceHandbook中的ImageNet预训练模型应用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表