首页 > 解决方案 > 将用户 IP 地址存储在数据库中,以便以后进行比较

问题描述


我对 React 很陌生,在做了一个 Todo 网络应用程序之后,我尝试创建我的第一个全栈网络应用程序。
该应用程序在输入电子邮件并按下按钮后发送请求,该按钮应将用户邮件发送到数据库并获取他的 IP,该 IP 也将存储到同一数据库中。这稍后将用于检查用户是否已经在网站上完成了某些操作(在输入电子邮件后客户端发送到下一页),如果电子邮件或 IP 已经存储在数据库中,则不允许用户继续. 在输入电子邮件时获取 IP 的最佳方法是什么,以及将其存储到数据库中的最佳方法是什么?(我什至应该把它存储在那里有更好的选择)。
我正在使用 Typescriptx 编写我的代码,并使用 Express 作为我的后端和 postgres 作为我的数据库。
TLDR:如何在收到客户端请求时获取客户端 IP onClick / 并将其存储在数据库中,以便稍后在用户再次发送相同请求时进行比较

标签: reactjstypescriptpostgresqlexpress

解决方案


在服务器端,您可以从传入请求中获取 IP 地址。这是执行此操作的正确方法(但请参见下文:我认为您可能不想这样做)。

在 express 中,这可以通过req.socket.remoteAddress. 如果您使用某种反向代理(例如 CDN),那么这将为您提供 CDN 的 IP,而不是真实用户,但所有现代代理都会在请求标头中包含原始 IP,X-Forwarded-For以便解决此问题。如果存在,您可以从那里获取 IP。您需要查看特定基础架构的文档,以检查他们在这种情况下使用的标头。


也就是说,听起来您正在尝试确保每个用户都可以做一件事,以便在发送电子邮件后不允许其他任何事情。是对的吗?

如果是这种情况,通过 IP 地址限制它不是一个很好的解决方案。两个原因:

  • 许多用户共享一个 IP 地址,例如, CGNAT后面的许多移动用户,每个人共享办公室/家庭等
  • 同时,许多用户拥有多个 IP 地址,例如办公室使用多个并行 Internet 连接进行故障转移或性能,或者人们将他们的计算机从家中带到咖啡馆等。

在这两种情况下,您最终都会错误地阻止或允许大量用户。通常,这种事情是通过客户端的 cookie/本地存储来完成的,这样您就可以阻止该个人用户的浏览器。这将在具有共享 IP 的环境和具有多个 IP 的环境中正常工作。

客户端方法不是 100% 安全的,因为技术用户可以轻松清除他们的 cookie 以避免这种情况。如果您需要硬性保证,那么这两种选择都行不通(更改 IP 也很容易:去外面的咖啡店坐下,或将手机用作热点)。在这种情况下,您需要将用户与他们无法轻易更改的东西联系起来,可能是电子邮件地址、信用卡,甚至是合法 ID,如果您正在认真尝试锁定它的话。

我不会打扰:对于大多数 Web 应用程序,客户端存储通常是正确的选择。


推荐阅读