Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 防止修改rails3表单中的隐藏字段?_Ruby On Rails_Ruby_Ruby On Rails 3_Forms - Fatal编程技术网

Ruby on rails 防止修改rails3表单中的隐藏字段?

Ruby on rails 防止修改rails3表单中的隐藏字段?,ruby-on-rails,ruby,ruby-on-rails-3,forms,Ruby On Rails,Ruby,Ruby On Rails 3,Forms,假设我有一个提交新帖子的表格 表单有一个隐藏字段,指定类别的id。我们也在该类别的显示视图中 我担心的是,使用firebug之类的东西的人可能只是在代码中编辑类别id,然后提交表单——为其他类别创建帖子 显然,我的形式更复杂,情况也不同——但想法是一样的。我也无法在帖子的“创建”控制器中定义类别,因为每个“显示”视图中的类别都不同 有什么解决办法吗 编辑: 这里有一个更好的问题-如果不在隐藏字段中,是否可以在帖子的创建控制器中获取类别id?pst是正确的-永远不要信任用户。仔细检查通过控制器中的

假设我有一个提交新帖子的表格

表单有一个隐藏字段,指定类别的id。我们也在该类别的显示视图中

我担心的是,使用firebug之类的东西的人可能只是在代码中编辑类别id,然后提交表单——为其他类别创建帖子

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

有什么解决办法吗

编辑:


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

pst是正确的-永远不要信任用户。仔细检查通过控制器中的视图发送的值,如果该值与有效值不匹配,则将用户踢出自动注销并向管理员发送电子邮件。如果用户的帐户持续发生,您可能还希望锁定该帐户

pst是正确的-永远不要相信用户。仔细检查通过控制器中的视图发送的值,如果该值与有效值不匹配,则将用户踢出自动注销并向管理员发送电子邮件。如果用户的帐户持续发生,您可能还希望锁定该帐户

您的站点是否在类别本身上有权限/访问控制列表的概念?如果用户可以访问另一个类别,那么我想说这里没有什么问题,因为没有任何东西可以阻止他们访问另一个类别并做同样的事情

如果您的类别受到某种限制,那么我建议将您的帖子嵌套在嵌套资源路由的类别下,并执行before_筛选器,以确保您被授予访问相应类别的权限

config/routes.rb

应用程序/控制器/posts\U控制器

URL看起来像

得到 /类别/1/员额/新 邮递
/类别/1/帖子

您的网站在类别本身上有权限/访问控制列表的概念吗?如果用户可以访问另一个类别,那么我想说这里没有什么问题,因为没有任何东西可以阻止他们访问另一个类别并做同样的事情

如果您的类别受到某种限制,那么我建议将您的帖子嵌套在嵌套资源路由的类别下,并执行before_筛选器,以确保您被授予访问相应类别的权限

config/routes.rb

应用程序/控制器/posts\U控制器

URL看起来像

得到 /类别/1/员额/新 邮递
/分类/1/帖子

当然,永远不要信任用户-

话虽如此,可以非常自信地依赖隐藏字段进行临时存储/暂存,尽管这通常也可以完全在服务器上通过会话进行处理:ASP.NET遵循此模型,并且已证明如果使用正确,它可以非常安全地防止篡改-那么秘密是什么

散列验证。本文简要讨论了ASP.NET MAC及其用法。简言之,MAC是表单数据的散列,使用服务器密钥(可能还有会话密钥)构建,该密钥作为隐藏字段嵌入表单中。当表单提交发生时,将根据数据重新计算此MAC,然后与原始MAC进行比较。因为只有服务器知道这些秘密,所以客户端实际上不可能从数据本身生成有效的MAC

但是,我不使用RoR,也不知道哪些模块(如果有的话)可以实现这样的安全性。我希望有人能对自己的答案提供更多的见解;-如果存在这样的解决方案,因为它是一个非常强大的构造,并且很容易允许安全的表单数据关联和验证


快乐的编码。

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

话虽如此,可以非常自信地依赖隐藏字段进行临时存储/暂存,尽管这通常也可以完全在服务器上通过会话进行处理:ASP.NET遵循此模型,并且已证明如果使用正确,它可以非常安全地防止篡改-那么秘密是什么

散列验证。本文简要讨论了ASP.NET MAC及其用法。简言之,MAC是表单数据的散列,使用服务器密钥(可能还有会话密钥)构建,该密钥作为隐藏字段嵌入表单中。当表单提交发生时,将根据数据重新计算此MAC,然后与原始MAC进行比较。因为只有服务器知道这些秘密,所以客户端实际上不可能从数据本身生成有效的MAC

但是,我不使用RoR,也不知道哪些模块(如果有的话)可以实现这样的安全性。我希望有人能对自己的答案提供更多的见解;-如果存在这样的解决方案,因为它是一个非常强大的c 结构简单,允许安全的表单数据关联和验证


快乐的编码。

哇!您的代码必须始终没有bug,否则,一群用户将一直被锁定在外:在过去的三年左右,有两个人被关在外面。哇!您的代码必须始终没有bug,否则,一群用户将一直被锁定在外:2在过去3年左右被锁定。下面推荐,将您的帖子资源嵌套在您的类别下,然后依靠路由加载相应的类别id URL。然后使用before_筛选器验证对下面推荐的类别的访问,将您的帖子资源嵌套在您的类别下,然后依靠路由加载相应的类别id URL。然后使用before_筛选器来验证对类别的访问。如果您在所有操作上都有before_筛选器,例如:否:除外,:仅选项,那么它不是必需的,因为before_筛选器将加载它。啊,谢谢!最后一件事-我以前的表单是@post的表单,但现在它正在寻找不同的路径。我应该如何指定它呢?对于@post,:url=>[@category,@post]或者如果您更喜欢[@post.category,@post]应该不工作,那么如果您要将post嵌套在许多资源下,您可以查看一些嵌套的资源宝石,以获得更简单的控制器/路由帮助。简言之,您需要告诉Rails您的@post嵌套在什么资源下。如果您在所有操作上都有before_筛选器,即no:except,:only选项,那么它不是必需的,因为before_筛选器将加载它。啊,谢谢!最后一件事-我以前的表单是@post的表单,但现在它正在寻找不同的路径。我应该如何指定它呢?对于@post,:url=>[@category,@post]或者如果您更喜欢[@post.category,@post]应该不工作,那么如果您要将post嵌套在许多资源下,您可以查看一些嵌套的资源宝石,以获得更简单的控制器/路由帮助。简而言之,您需要告诉Rails您的@post嵌套在什么资源下。
resources :categories do 
  resources :posts
end
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