1. 问:你们项目是如何在后端获取用户 IP 的?
答:
在 web-server 项目中,获取用户 IP 主要通过 Express 的 req.ip 属性实现。例如在 controllers/web/ViewRecordController.js 和 controllers/web/viewRecord.js 中,直接用 const userIp = req.ip; 获取用户 IP。
此外,为了兼容代理、Nginx 等,middleware/BruteForceProtection.js 中还实现了 getClientIP 方法,会优先读取 x-real-ip、x-forwarded-for 等头部,保证获取到真实客户端 IP。
2. 问:你们如何处理代理或负载均衡下获取真实用户 IP?
答:
在 middleware/BruteForceProtection.js 的 getClientIP 方法中,优先读取 x-real-ip、x-forwarded-for 头部,如果没有再用 req.ip。这样即使在 Nginx、CDN 等代理转发场景下,也能获取到用户的真实 IP,避免都变成 127.0.0.1。
3. 问:用户 IP 在项目中有哪些实际用途?
答:
- 登录安全:在
LoginAttemptService.js、BruteForceProtection.js等用于记录登录尝试,防止暴力破解,对同一 IP 多次失败进行锁定。 - 行为统计:在
ViewRecordService.js、ViewRecordModel.js中,记录用户访问文章、产品等的 IP,用于防刷、统计和分析。 - 管理后台:可查询、解锁被锁定的 IP(如
/adminapi/login-attempts/locked-ips接口)。
4. 问:你们如何存储和索引用户 IP?
答:
- 在 MongoDB 的相关 Model(如
LoginAttemptModel.js、ViewRecordModel.js)中,IP 作为字段存储,并建立了索引(如loginAttemptSchema.index({ ip: 1, attemptTime: -1 })),便于高效查询和统计。 - 这样可以快速查找某个 IP 的历史行为、失败次数等。
5. 问:你们如何防止用户伪造 IP 或绕过安全限制?
答:
- 只信任 Nginx 或可信代理设置的
x-real-ip、x-forwarded-for,并在生产环境配置好代理头部转发,防止用户直接伪造。 - 对于敏感操作(如登录、投票等),结合用户 ID、IP、User-Agent 多维度校验,提升安全性。
- 对于异常高频 IP,后台可人工审核和解锁,防止误伤。