【问题标题】:Rails 5.1 Routes: dynamic :action parametersRails 5.1 路由:动态 :action 参数
【发布时间】:2016-05-03 15:48:36
【问题描述】:

Rails 5.0.0.beta4 对包含动态 :action 和 :controller 段的路由引入了弃用警告:

DEPRECATION WARNING: Using a dynamic :action segment in a route is deprecated and will be removed in Rails 5.1. 

The commit message from this PR 状态:

允许通过路径指定 :controller 和 :action 值 在 config/routes.rb 中是许多问题的根本原因 在导致安全发布的 Rails 中。有鉴于此 最好将控制器和操作明确列入白名单 而不是试图将“坏”值列入黑名单或清理。

您将如何将一组操作参数“列入白名单”?我的路由文件中有以下内容,它们会引发弃用警告:

namespace :integrations do
  get 'stripe(/:action)', controller: 'stripe', as: "stripe"
  post 'stripe/deactivate', controller: 'stripe', action: 'deactivate'
end

【问题讨论】:

  • 显而易见的答案似乎是明确定义每个动作,但这在具有许多自定义动作的控制器中似乎很麻烦。也许这是最好的做法,n'est-ce pas?

标签: ruby-on-rails-5


【解决方案1】:

虽然有点麻烦,但最好的办法似乎是明确定义路由:

namespace :integrations do
  namespace 'stripe' do
    %w(auth webhook activate).each do |action|
      get action, action: action
    end
  end
  post 'stripe/deactivate', controller: 'stripe', action: 'deactivate'
end

【讨论】:

  • 只是一个小评论。在get action, action: action 中,您可以省略该操作,因为 Rails 默认使用与 get 同名的操作。因此get action 就足够了。
【解决方案2】:

和你的情况不一样,但我是这样做的:

class PagesController < ApplicationController
  def index
    render params[:path]
  end
end

路线:

get ':path', to: 'pages#index'

我想如果我想要一个嵌套路径,我会使用*

get '*path', to: 'pages#index'

【讨论】:

  • 是的,我选择了与此非常相似的解决方案。但是,这样做有什么安全问题吗?一个奇怪的副作用是您现在可以访问部分页面。例如。如果你有views/pages/_sidebar.html.erb,你现在可以访问/_sidebar
  • @BradWerth 我知道这种代码可能是不安全的,但是在这种情况下文章没有给出示例,params[:path] 是一个字符串,它只会寻找一个文件匹配路径跨度>
  • 对,我主要是在回答@Obversity 的未回答问题。我发布了一个 Rails 票证的链接,其中包含如何在不同的评论中滥用这种类型的东西(目录遍历)的示例,如果你好奇的话,我也会把它放在这里。 github.com/rails/rails/issues/27231#issuecomment-304650177
  • 谢谢,这也很难理解,我想是为了防止有人可以做类似render params[:path] if File.exists?(Rails.root.join 'app', 'views', 'pages', params[:path]) &amp;&amp; !params[:path].starts_with?('_')... 嗯,但我想这就是他们不推荐使用动态操作的原因...很多情况下
【解决方案3】:

它是这样工作的:

得到“条纹(/:动作)”,控制器:“条纹”,动作::动作,如:“条纹”

【讨论】:

  • 这正是已被弃用的内容。
  • @JamesMoore 是否有关于已弃用的文档
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 2023-04-11
  • 2019-05-24
  • 1970-01-01
  • 2020-02-13
  • 2014-11-08
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多