【问题标题】:IP address based authorization基于 IP 地址的授权
【发布时间】:2020-02-11 00:33:37
【问题描述】:

我正在为投票管理开发一个简单的 Spring Boot RESTful API。简而言之,可以创建公共投票,其他“用户”可以投票。

现在我必须确保每个客户每次投票只投票一次。因为我想防止使用HTTP BasicJWT等常见的身份验证机制,所以我考虑了通过客户端IP地址进行授权。意味着我在数据库中存储如下实体:

public class Vote {

    private Long pollId;
    private Long choiceId;
    private String ipAddress;

    ...
}

使用类似这样的方法,我可以避免身份验证和帐户管理的需要。

这是正确的方法还是有更好的方法来确保每个客户只投票一次?另外如何处理IP欺骗?希望有任何建议。

【问题讨论】:

  • 当设备连接到互联网时,每次都会分配一个不同的 IP 地址(除非使用静态 IP)。您应该改用 MAC 地址等。
  • @MushifAliNawaz 你建议我们如何获取客户端的 MAC 地址?
  • @Malt 好吧,我们无法从请求中提取它。我只是建议应该使用 MAC 地址而不是 IP 地址。
  • @MushifAliNawaz 这就像提议我们使用客户端的 CPU 序列号一样。没有办法得到这些东西。
  • 就像我说的,它本身并不是万无一失的,但绝大多数(善意的)用户还是主要使用他们的一个主浏览器。万无一失的唯一方法是对用户进行身份验证并将投票存储在他们的帐户中。即便如此,是什么阻止他们打开另一个?如果您使用的是 IP 地址,您甚至可能无法为移动设备用户获得唯一的 IP 地址,这可能取决于他们的网络。

标签: java spring-boot spring-mvc authorization spring-rest


【解决方案1】:

这是正确的方法还是有更好的方法来确保每个 客户只投票一次?

不是真的。每台计算机都有一个唯一的 IP 地址的想法只是部分正确。

实际上,人们拥有不止一种设备(例如电话、工作中的计算机、家中的计算机)。每个设备都可以连接到不同的网络,每个设备都有一个唯一的 IP。此外,IP 地址更改非常频繁。断开您的家庭调制解调器/路由器几分钟,当它重新连接时,您可能会获得一个新的 IP 地址。所以可以改变他的家庭IP并再次投票。此外,许多(如果不是大多数)客户端位于NAT 设备后面,这意味着它们的 IP 与许多其他用户共享。根据您提出的方案,一旦与您投票的 NAT 背后有人投票,其他人就无法投票。 最后,用户可以轻松使用 VPN、TOR 和各种其他技术,基本上可以根据需要进行多次投票。

还有如何处理IP欺骗?

如果使用 TCP,IP 地址欺骗并非易事。但是,获取与当前 IP 地址不同的实际 IP 地址非常容易(VPN、TOR 等),而且您几乎无能为力。

【讨论】:

  • 您是否有另一种无需用户帐户的身份验证方法?
  • 什么万无一失?不,但您可以使用其他信息,而不仅仅是 IP 地址。例如,很难快速更改的电话号码。您还可以使用浏览器指纹识别技术来尝试识别再次返回的同一台计算机。
猜你喜欢
  • 1970-01-01
  • 2022-11-08
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多