2010-01-03 50 views

回答

7

这是很好的做法,从你的路由文件的底部删除下列生成路线:

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

由于这些可以离开敞开大门猜测的一样,破坏破坏性操作。我尝试通过使用命名路线来明确哪些路线是允许的并且map.resources

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形式的默认路由。你会发现注释掉默认路由将会阻止你不希望发生的行为。如果你正在小心地定义所有将被使用的资源和路由,这应该不成问题。

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

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