我试图建立一个不会让一个用户投票两次的投票功能,但我不想让任何人登录,所以我想记录一个用户'的IP地址并禁止它。我做了以下事情:
查看:
<%= link_to "vote", vote_user_path(@user), method: :post, :class => "btn" %>
控制器:
def vote
@user = User.find(params[:id])
Vote.create!(ip: request.remote_ip, voteable_id: params[:id], voteable_type: "User")
redirect_to @user
end
但由于某种原因,Vote.last.ip返回&#34; 127.0.0.1&#34;。我的意思是,我对IP地址了解不多,但它不应该是一个六位数的数字,对吗?我做错了什么,或者由于某种原因它是不同的,因为我处于开发模式?
2 个答案:
答案 0 :(得分:3)
127.0.0.1
不是六位数字,而是localhost的IP地址。
如果你在测试它的同一台机器上运行rails应用程序服务器,那么这就是你获得127.0.0.1
的原因。如果您从可访问网络内的其他计算机上测试了您的应用程序,那么您应该看到准确的IP。
有关详细信息,请参阅remote_ip
上的文档。
就IP设计的限制而言,如果用户落后于NAT
,那么您将不仅禁止一个用户。在确定设计之前,我确定你必须考虑过这个问题。
答案 1 :(得分:1)
IPv4地址通常用点十进制表示法编写,它由地址的四个八位字节组成,以十进制表示,并以句点分隔,例如:250.199.354.123
。
在大多数计算机系统上,localhost
解析为地址127.0.0.1
,这是最常用的IPv4
环回地址。
remote_ip
确定原始IP地址,在您的情况下是localhost。如前所述,它解析为地址127.0.0.1
。
如果您从运行服务器的设备投票,
request.remote_ip
将返回字符串"127.0.0.1"
。
您应该知道很容易让其他IP欺骗,或者丢失同一网络上众多有效用户的投票(具有相同的IP地址)。