Rails应该神奇地看到请求是“DELETE”与“GET”请求,对吗?
我可以点击http://localhost/controller/destroy/1
并删除记录。开发人员通常如何防止这种愚蠢的删除?
答案 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$)/}