【问题标题】:Ruby on Rails - Restricting click by IPRuby on Rails - 通过 IP 限制点击
【发布时间】:2010-12-18 19:01:09
【问题描述】:

我是 Rails 新手,所以请轻松一点。我创建了一个博客,可以通过使用类似于 Facebook 的“点赞”的功能对帖子进行“投票”。我没有使用任何身份验证,但想限制 IP 对特定帖子的投票。也就是说,一旦有人为某个帖子投票,他们就不能再次投票(当然,除非他们重置了他们的路由器)。

我觉得这应该是我通过修改投票或帖子模型来影响的东西,但我担心它与 Sessions 有关,...我还没有任何经验。

如果您需要我发布任何代码,请告诉我。这是投票控制器。

class VotesController < ApplicationController

  def create
    @post = Post.find(params[:post_id])
    @vote = @post.votes.create!(params[:vote])

       respond_to do |format|
       format.html { redirect_to @post}
       format.js
     end
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby authentication session blogs


    【解决方案1】:

    您可以在votes 表和validates_uniqueness_of :ip_address 中添加ip_address 属性,以确保IP 只能投一票。

    【讨论】:

      【解决方案2】:

      立即想到两种方法,可能还有其他方法。两者都需要在数据库中存储一个 IP。

      1. 通过唯一性验证阻止创建投票。

        class Vote < ActiveRecord::Base
          validates_uniqueness_of :ip_address
          ...
        end
        
      2. 阻止在控制器中创建投票

        class VotesConroller < ApplicationController
          ...
          def create
            unless Vote.find_by_post_id_and_ip_address(params[:post_id],request.remote_ip)
               posts.votes.create!(params[:vote].update({:ip_address => request.remote_ip}))
            end
          end
        end
        

      【讨论】:

      • 这太好了...如何将 ip 地址从表单传递到表。我创建了列 ip_address。
      • 我试过了: request.remote_ip 但没用。
      • 您甚至不需要在表单中收集IP地址。只需让控制器通过它。请参阅第二种方法中的 Vote.create 行以了解如何执行此操作。 (假设列名是 ip_address
      • 我已经在上面发布了我的投票控制器代码。我遇到麻烦可能是因为 post_id 的收集。
      • 仅供参考 - 你不想走 路线的原因是因为用户可以轻松修改。您需要像上面发布的 EmFi 那样在控制器中强制它。
      【解决方案3】:

      我会同时执行 EmFi 和 Bensie 说的操作,并将 IP 地址与投票一起存储,但您可能还想考虑创建一个您想要阻止的 IP 黑名单,因为它们代表流行的代理服务器(例如,许多代理在http://proxy.org/ 列表中)。

      当您添加到列表中时,它至少会让用户更难作弊。

      【讨论】:

      • 非常感谢。在 EmFi 上查看我的 cmets,需要一些关于如何传递到表的帮助。我是新人。
      • 很好,remote_ip 应该使用 HTTP_CLIENT_IP 或 HTTP_X_FORWARDED_FOR 标头获取代理背后的 IP。但是,它可能并非完美无缺。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2010-09-15
      • 2016-01-24
      • 1970-01-01
      • 2012-06-12
      相关资源
      最近更新 更多