ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Sails.js 请求对象 `req.ips`:在反向代理场景下正确读取客户端真实 IP 列表

Sails.js 请求对象 `req.ips`:在反向代理场景下正确读取客户端真实 IP 列表 后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载req.ips是 Sails.js 请求对象req上的一个只读属性用于在应用部署于反向代理如 Nginx、Heroku、负载均衡器之后时获取请求头X-Forwarded-For中携带的完整 IP 地址链。本文以仓库内文档 docs/reference/req/req.ips.md 为核心结合 Sails 核心源码中trustProxy的配置解析与传递机制说明req.ips的取值规则、启用前提、典型用法以及如何在代理环境下手动校验该属性从而在控制器、策略或自定义中间件中实现基于真实客户端 IP 的日志、限流与安全逻辑。属性速览项说明类型((array)) —— 字符串数组IP 地址字符串列表适用对象Sails 请求对象req取值来源请求头X-Forwarded-For前置条件开启sails.config.http.trustProxy未开启时的返回值空数组[]req.ips与请求对象上的其他元数据如req.host、req.port、req.baseUrl等一样由 Sails 的 request hook 在请求处理流程中注入供控制器、策略、自定义中间件和响应逻辑统一读取。其具体实现依赖底层 Express 的 trust proxy 机制Sails 只负责把用户配置透传给 Express 应用实例。取值规则只有在信任代理时才有效req.ips的核心行为可以概括为一句话当sails.config.http.trustProxy启用时req.ips返回本次请求X-Forwarded-For请求头中的 IP 地址数组否则返回空数组。之所以必须有这个前提是因为X-Forwarded-For是一个可以由客户端任意伪造的请求头。若应用直接暴露在公网、没有经过可信代理那么读取该请求头并把其中内容当作客户端真实 IP 使用就等同于允许攻击者伪造 IP。因此 Sails 默认不信任该请求头req.ips也就默认返回空数组。这一点在源码中有明确体现。在 lib/hooks/http/index.js 中sails.config.http.trustProxy的默认值被定义为false// Should be left false unless behind a proxy. // (this is passed in to Express as the trust proxy setting) trustProxy: false,而在 lib/hooks/http/initialize.js 中Sails 启动 HTTP 服务时会将用户配置透传给 Express// Set Express trust proxy if appropriate. // https://expressjs.com/en/guide/behind-proxies.html if (sails.config.http.trustProxy) { expressApp.set(trust proxy, sails.config.http.trustProxy); }透传之后Express 会依据 trust proxy 的语义解析X-Forwarded-For、X-Forwarded-Proto等转发头并据此填充req.ip、req.ips、req.protocol等属性。因此req.ips的最终计算结果由 Express 完成Sails 负责的是配置的校验与透传。使用语法req.ips是一个属性而不是方法直接读取即可req.ips;示例解析代理链上的完整 IP 列表假设应用部署在反向代理之后客户端请求经由proxy1、proxy2两级代理转发到 Sails 应用请求头为X-Forwarded-For: client, proxy1, proxy2那么读取req.ips的结果为req.ips; // - [client, proxy1, proxy2]其中数组第一个元素client是最初发起请求的客户端 IP最后一个元素proxy2是离应用最近最下游的代理 IP。文档注释特别指出// (proxy2 is the furthest down-stream IP address)也就是说X-Forwarded-For请求头中 IP 的排列顺序是最原始客户端在前、最近代理在后每经过一跳代理代理会在其右侧追加自己的 IP。这一点在书写日志、生成审计记录时尤其需要注意如果需要记录客户端真实 IP应取数组的第一个元素而不是req.ip的语义可能返回的最近一跳代理地址。如何启用配置sails.config.http.trustProxy要让req.ips返回真实数据必须在应用配置中开启信任代理。Sails 应用约定在config/http.js中配置// config/http.js module.exports.http { trustProxy: true };关于该配置项的取值官方文档 docs/reference/sails.config/sails.config.http.md 中的说明如下项说明类型((boolean)) 或 ((function))默认值undefined语义告诉 Sails/Express 应如何解释 X-Forwarded 请求头文档还给出了重要的使用前提与建议仅在 HTTPS 反向代理部署场景下使用例如部署在 Heroku 这类 PaaS 平台上若应用直接面向公网、不在代理之后保持默认值不配置即可多数部署场景下从true起步即可满足需求若true不满足需求可参考 Express 官方 behind proxies 指南中支持的全部取值包括具体的 IP 地址、子网、IP 数组、自定义函数等。非法取值的校验Sails 在 http hook 的configure阶段会对trustProxy做合法性校验。在 lib/hooks/http/index.js 中可以看到当该值被设置为0、空字符串、null或NaN时Sails 会直接抛出编码为E_HTTP_BAD_TRUSTPROXY的应用启动错误并提示The sails.config.http.trustProxy property cannot be zero, empty string, null or NaN. The property is currently set to: .... To indicate that your app is directly facing the internet, set trustProxy to false.这一行为在测试 test/hooks/http/initialize.test.js 中有对应用例以http: { trustProxy: }启动应用时期望应用 lift 失败并返回E_HTTP_BAD_TRUSTPROXY错误。这提醒我们不要用空字符串等方式关闭信任代理正确做法是保持默认undefined或显式设为false。与req.host等元数据的联动trustProxy不仅影响req.ips还会影响 Sails 对请求元数据的整体判断。在 lib/hooks/request/metadata.js 中Sails 的 request hook 会依次检查req.app.get(trust proxy)HTTP 请求与sails.config.http.trustProxy虚拟请求如 socket来确定req.protocol、req.host、req.port、req.baseUrl的取值当信任代理且存在X-Forwarded-Host请求头时会优先采用转发头中的主机名if (trustProxy xForwardedHostHeader) { host xForwardedHostHeader.split(/,\s*/)[0]; }也就是说trustProxy是一组相互关联的信任代理开关统一影响req.ips、req.host、req.protocol、req.baseUrl等属性的解析结果而不是单独为req.ips服务。实际应用场景1. 记录真实客户端 IP 的访问日志在自定义中间件或控制器中可以结合req.ips与req.ip记录链路信息// api/controllers/log/view.js module.exports { friendlyName: Log client IP chain, fn: async function () { const ipChain this.req.ips; // 数组第一个元素是原始客户端 IP const clientIp ipChain[0]; sails.log.info(Client IP chain: ${ipChain.join( - )}); return { clientIp, ipChain }; } };2. 基于真实 IP 的限流与安全策略在 policies 中基于req.ips做来源校验时务必先确认trustProxy已正确开启否则req.ips恒为空数组、逻辑将失效同时正因为X-Forwarded-For可被伪造开启trustProxy的前提是保证代理确实可信例如限制代理来源 IP避免攻击者直接构造该请求头绕过基于 IP 的访问控制。常见疑问Q不配置trustProxy时req.ips是什么A空数组[]。这是文档明确规定的默认行为也是安全默认值——Sails 默认不信任任何转发头。Qreq.ips与req.ip有什么区别Areq.ips返回X-Forwarded-For中的完整 IP 链数组req.ip在启用trustProxy时返回链中离应用最近的可信跳对应的 IP通常是原始客户端 IP具体语义由 Express 的 trust proxy 配置决定。两者都依赖trustProxy。Q数组元素的顺序是什么AX-Forwarded-For中从左到右依次为原始客户端、各中间代理数组首个元素为客户端 IP末位元素为最下游离应用最近的代理 IP。Q虚拟请求socket也支持req.ips吗AtrustProxy的判定同时覆盖 HTTP 请求与虚拟请求见 lib/hooks/request/metadata.js 对sails.config.http.trustProxy的回退判断但 socket 请求本身通常不会携带可伪造的转发头实际使用中请以具体传输层为准。总结req.ips是 Sails 在反向代理部署场景下读取客户端 IP 链的关键属性它以sails.config.http.trustProxy为总开关开启后返回X-Forwarded-For请求头的 IP 数组未开启时返回空数组。使用时牢记三点其一仅在可信代理之后才开启trustProxy其二切勿把trustProxy设置为0、空字符串、null或NaN否则应用将因E_HTTP_BAD_TRUSTPROXY拒绝启动其三解析数组时取首元素为原始客户端 IP。结合 docs/reference/sails.config/sails.config.http.md 与 docs/reference/req/req.ips.md 两份文档即可在日志审计、限流防刷等场景中准确、安全地使用客户端真实 IP。赞分享后端【免费下载链接】sailsRealtime MVC Framework for Node.js项目地址https://gitcode.com/gh_mirrors/sa/sails点击查看免费下载相关推荐Sails req.ip 完全指南获取请求客户端 IP 及反向代理场景下的正确配置Sails req.ip 完全指南获取请求客户端 IP 及反向代理场景下的正确配置 在 SailsRealtime MVC Framework for No后端N_m3u8DL-RE 上手指南一条命令下载、解密并合并 m3u8 与 mpd 流N_m3u8DL RE 上手指南一条命令下载、解密并合并 m3u8 与 mpd 流 N_m3u8DL RE 是一款跨平台的流媒体下载工具支持 HLSm3uCLI音视频Qinglong 面板部署在反向代理后如何配置并诊断客户端真实 IPQinglong 面板部署在反向代理后如何配置并诊断客户端真实 IP 当 Qinglong青龙面板部署在 Nginx 等反向代理之后时面板从连接上拿到的地任务调度后端前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表