带有参数 [:controller] 的动态 link_to 路径:Brakeman 危险发送

Dynamic link_to path with params[:controller]: Brakeman Dangerous Send

我有以下部分 _filters.html.haml 已在我的代码中多次使用:

- resource ||= params[:controller]
= link_to send("delete_#{resource}_path"), method: :delete, data: { confirm: delete_confirmation } do
   = fa_icon delete_icon, class: 'm-r-quarter', text: delete_text

它有一个由params[:controller]构造的动态删除路径。 Brakeman 对上述代码给出以下错误消息:

Confidence: High
Category: Dangerous Send
Check: Send
Message: User controlled method execution
Code: send("delete_#{params[:controller]}_path")

这是 Brakeman 显示的有效错误吗?我知道将参数列入白名单是避免危险发送的一种解决方案。有没有更好的方法解决这个问题?

这实际上不允许执行用户控制的方法,因为 params[:controller]params[:action] 由 Rails 路由器设置,并将覆盖任何用户提供的值。

虽然很臭。稍微改进一下就是使用 controller_name 辅助方法:

= link_to send("delete_#{controller_name}_path"), ...

但它真的回避了一个问题,为什么你一开始就把这个怪物强加给自己。这甚至应该做什么,因为它缺少一个 id - 摧毁一切?

如果您想销毁 Rails 中的资源,请向成员路径发送 DELETE 请求:

DELETE /things/1

由于 URL 中没有愚蠢的前缀,您可以通过以下方式生成它:

= link_to(model_instance, method: :destroy) do
  = fa_icon delete_icon, class: 'm-r-quarter', text: delete_text

如果您确实需要动态生成路径,请使用 the polymorphic route helpers 而不是发送:

= link_to [:delete, controller_name], method: :delete, data: { confirm: delete_confirmation } do
  = fa_icon delete_icon, class: 'm-r-quarter', text: delete_text