怎样获取用户ip

94 阅读2分钟

1. 问:你们项目是如何在后端获取用户 IP 的?

答:
在 web-server 项目中,获取用户 IP 主要通过 Express 的 req.ip 属性实现。例如在 controllers/web/ViewRecordController.jscontrollers/web/viewRecord.js 中,直接用 const userIp = req.ip; 获取用户 IP。
此外,为了兼容代理、Nginx 等,middleware/BruteForceProtection.js 中还实现了 getClientIP 方法,会优先读取 x-real-ipx-forwarded-for 等头部,保证获取到真实客户端 IP。


2. 问:你们如何处理代理或负载均衡下获取真实用户 IP?

答:
middleware/BruteForceProtection.jsgetClientIP 方法中,优先读取 x-real-ipx-forwarded-for 头部,如果没有再用 req.ip。这样即使在 Nginx、CDN 等代理转发场景下,也能获取到用户的真实 IP,避免都变成 127.0.0.1。


3. 问:用户 IP 在项目中有哪些实际用途?

答:

  • 登录安全:在 LoginAttemptService.jsBruteForceProtection.js 等用于记录登录尝试,防止暴力破解,对同一 IP 多次失败进行锁定。
  • 行为统计:在 ViewRecordService.jsViewRecordModel.js 中,记录用户访问文章、产品等的 IP,用于防刷、统计和分析。
  • 管理后台:可查询、解锁被锁定的 IP(如 /adminapi/login-attempts/locked-ips 接口)。

4. 问:你们如何存储和索引用户 IP?

答:

  • 在 MongoDB 的相关 Model(如 LoginAttemptModel.jsViewRecordModel.js)中,IP 作为字段存储,并建立了索引(如 loginAttemptSchema.index({ ip: 1, attemptTime: -1 })),便于高效查询和统计。
  • 这样可以快速查找某个 IP 的历史行为、失败次数等。

5. 问:你们如何防止用户伪造 IP 或绕过安全限制?

答:

  • 只信任 Nginx 或可信代理设置的 x-real-ipx-forwarded-for,并在生产环境配置好代理头部转发,防止用户直接伪造。
  • 对于敏感操作(如登录、投票等),结合用户 ID、IP、User-Agent 多维度校验,提升安全性。
  • 对于异常高频 IP,后台可人工审核和解锁,防止误伤。