带有 params[:controller] 的动态 link_to 路径: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,text: delete_text

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...