代码之家  ›  专栏  ›  技术社区  ›  dpb

Rails:属于关系的大规模分配安全问题

  •  5
  • dpb  · 技术社区  · 14 年前

    我一直在阅读有关铁路安全的问题,其中最让我担心的是大规模作业。我的应用程序正在使用attr_,但是我不确定我是否完全知道处理暴露关系的最佳方法是什么。假设我们有一个基本的内容创建/所有权网站。用户可以创建博客文章,并拥有与该博客文章关联的一个类别。

    所以我有三个模型:

    • 用户
    • 职位: 属于用户和类别
    • 类别: 属于用户

    我允许对类别“id”进行批量分配,这样用户就可以取消它,将其更改为其类别之一,或者通过批量分配,我想他们可以将其更改为其他人的类别。这就是我不确定继续下去的最佳方式的地方。

    我调查过的资源(尤其是 railscast #178 和A resource 这是由铁路公司提供的),两者都提到,协会不应是大规模分配,这是有道理的。我只是不确定如何允许用户更改 类别 邮递 以一种粗俗的方式。

    关于如何最好地解决这个问题有什么想法吗?我是不是看错了?

    更新 希望能进一步澄清我的担忧。

    假设我在岗位上,我是否需要如下内容:

    def create
      @post = Post.new(params[:category])
    
      @post.user_id = current_user.id
    
      # CHECK HERE IF REQUESTED CATEGORY_ID IS OWNED BY USER
    
      # continue on as normal here
    end
    

    这似乎是很多工作?我需要在更新和创建操作中的每个控制器上检查这一点。请记住,不仅仅只有一个属于关系。

    2 回复  |  直到 14 年前
        1
  •  5
  •   John Topley    14 年前

    我想,您的用户可以通过某种编辑形式对其进行更改。

    基于这一点,批量分配实际上是针对那些通过诸如curl之类的东西来扰乱你的应用程序的邪恶类型。我叫他们“卷发小子”。

    如果你使用 attr_protected -(把你不想换的田地放在这里)或者孩子最喜欢的 attr_accessible (可以更改的字段)。

    你会听到两人的争论,但如果你使用 attr_protected :user_id 在您的模型中,然后在您的CategoryController中创建操作,您可以执行如下操作

    def create
      @category = Category.new(params[:category])
    
      @category.user_id = current_user.id
      respond_to do |format|
    ....#continue on as normal here
    end
    
        2
  •  0
  •   dpb    14 年前

    好吧,所以四处找了找,最后找到了一些对我有用的东西。我喜欢尽可能避免控制器中的逻辑,因此此解决方案是基于模型的解决方案:

    # Post.rb
    validates_each :asset_category_id do |record, attr, value|
      self.validates_associated_permission(record, attr, value)
    end
    
    # This can obviously be put in a base class/utility class of some sort.
    def self.validates_associated_permission(record, attr, value)
      return if value.blank?
      class_string = attr.to_s.gsub(/_id$/, '')
      klass = class_string.camelize.constantize
    
      # Check here that the associated record is the users
      # I'm leaving this part as pseudo code as everyone's auth code is
      # unique.
      if klass.find_by_id(value).can_write(current_user)
        record.errors.add attr, 'cannot be found.'
      end
    end
    

    我还发现Rails3.0将有更好的方法来指定它,而不是每个超通用验证所需的3行。

    http://ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators