我正在开发用于轮询管理的简单Spring Boot RESTful API。简而言之,可以创建公共民意测验,而其他“用户”可以投票支持。
现在,我必须确保每个客户每次投票只投票一次。因为我想避免使用诸如HTTP Basic
或JWT
之类的通用身份验证机制,所以我考虑过通过客户端IP地址进行授权。意味着我将如下所示的实体存储在数据库中:
public class Vote {
private Long pollId;
private Long choiceId;
private String ipAddress;
...
}
使用类似的方法,可以避免身份验证和帐户管理的需要。
这是正确的方法还是有更好的方法来确保每个客户只投票一次?另外如何处理IP欺骗?希望有任何建议。
答案 0 :(得分:2)
这是正确的方法还是有更好的方法来确保每种方法 客户只投票一次?
不是。每台计算机都有唯一IP地址的想法只是部分正确。
实际上,人们拥有一个以上的设备(例如电话,工作中的计算机,家里的计算机)。而且每个设备都可以连接到不同的网络,并且每个设备都有唯一的IP。而且,IP地址更改非常频繁。断开家用调制解调器/路由器的连接几分钟,您可能会在重新连接时获得一个新的IP地址。因此,可以更改其家庭IP并再次投票。此外,许多(如果不是大多数的话)客户端位于NAT设备的后面,这意味着它们的IP已与许多其他用户共享。根据您提出的方案,一旦有人在与您相同的NAT支持下投票,其他任何人都无法投票。 最后,用户可以轻松地使用VPN,TOR和其他各种技术来进行所需的基本投票。
还应该如何处理IP欺骗?
如果使用TCP,则IP地址欺骗并非易事。但是,获得一个与当前IP地址不同的实际IP地址非常容易(VPN,TOR等),而且您几乎无能为力。