如何在Rails中保持GET请求不被删除

时间:2010-01-03 05:31:37

标签: ruby-on-rails get

Rails应该神奇地看到请求是“DELETE”与“GET”请求,对吗?

我可以点击http://localhost/controller/destroy/1并删除记录。开发人员通常如何防止这种愚蠢的删除?

2 个答案:

答案 0 :(得分:7)

最好从路径文件底部删除以下生成的路径:

map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'

因为这些可以让门开启可以猜测的破坏性行为,比如毁灭。我尝试通过使用命名路由和map.resources

来明确允许哪些路由

答案 1 :(得分:3)

这里有一些潜在的问题。

HTML规范无法生成PUT或DELETE请求。在Rails和大多数其他RESTful Web应用程序中,PUT和DELETE请求是通过Javascript onclick属性伪造的。因此,在没有启用Javascript的情况下处理来自浏览器的销毁请求是很有用的。伪造是通过将DELETE方法的隐藏表单提交给资源来实现的。此表单包含应用程序的真实性标记。

其次,我认为这种行为来自默认路由。在routes.rb文件中使用带有map.resource(s)的rails中的RESTful资源。不应该生成那条路线。您可能会注意到/controller/destroy/:id未列出rake routes,但它确实符合默认路由的:controller/:action/:id形式。您会发现注释掉默认路由会阻止您的不良行为。如果您正在注意定义将要使用的所有资源和路由,这应该不是问题。

如果您不想完全删除默认路由,可以添加一个要求,以便不匹配destroy或任何其他有害操作。

map.connect ':controller/:action/:id', 
  :requirements => {:action => /^(?!destroy$)/}
map.connect ':controller/:action/:id.format',
  :requirements => {:action => /^(?!destroy$)/}