防止rails3中表单中隐藏字段的修改(“黑客攻击”)?

时间:2011-09-24 01:45:08

标签: ruby-on-rails ruby ruby-on-rails-3 forms

所以我想说我有一个提交新帖子的表格。

表单有一个隐藏字段,指定category_id。我们也在这个类别的节目视图中。

我担心的是,有人使用像firebug这样的东西,可能只是编辑代码中的类别ID,然后提交表单 - 为不同类别创建帖子。

显然我的形式更复杂,情况也不同 - 但这个想法是一样的。我也无法在帖子的创建控制器中定义类别,因为每个节目视图的类别都不同......

任何解决方案?

编辑:

这是一个更好的问题 - 是否可以在帖子的创建控制器中获取类别ID,如果它不在隐藏字段中?

3 个答案:

答案 0 :(得分:2)

pst是对的 - 永远不要相信用户。仔细检查通过控制器中的视图发送的值,如果它不匹配有效的内容,请将用户踢出(自动注销)并向管理员发送电子邮件。如果用户的帐户不断发生,您可能还想锁定该帐户。

答案 1 :(得分:2)

您的网站是否具有类别本身的权限/访问控制列表的概念?如果用户可以访问其他类别,那么我会说这里没有任何担心,因为没有什么能阻止他们去其他类别并做同样的事情。

如果您的类别以某种方式受到限制,那么我建议将您的帖子嵌套在一个类别(嵌套资源路由)下,并执行before_filter以确保您被授予访问相应类别的权限。

config/routes.rb

resources :categories do 
  resources :posts
end

app/controllers/posts_controller

before_filter :ensure_category_access

def create
  @post = @category.posts.new(params[:post])
  ...
end

private
def ensure_category_access
   @category = Category.find(params[:category_id])
   # do whatever you need to do. if you don't have to validate access, then I'm not sure I'd worry about this.  
   # If the user wants to change their category in their post instead of 
   # going to the other category and posting there, I don't think I see a concern?
end

网址看起来像

GET /categories/1/posts/new POST /categories/1/posts

答案 2 :(得分:2)

当然,永远不要相信用户; - )

现在,正如所说的那样,可能具有非常高的置信度依赖隐藏字段进行临时存储/暂存(尽管通常也可以在服务器上完全处理会话也是如此):ASP.NET遵循这个模型,如果正确使用它已被证明非常安全防止篡改 - 那么秘密是什么?

哈希验证又名MAC (Message Authentication Code) 。这个article简要讨论了ASP.NET MAC和用法。简而言之,MAC是表单数据的散列(使用服务器构建 - 可能是会话 - 密钥),它作为隐藏字段嵌入到表单中。当表单提交发生时,从数据重新计算该MAC,然后与原始MAC进行比较。由于秘密仅为服务器所知,因此客户端(实际上)无法从数据本身生成有效的MAC。

但是,我不使用RoR或知道哪些模块(如果有的话)可以实现这样的安全性。我希望有人可以提供更多的洞察力(在他们自己的答案中;-)如果存在这样的解决方案,因为它是非常强大的构造并且容易允许安全的 per-form 数据关联和验证。

快乐的编码。