0

我的代码中有以下部分_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 显示的有效错误吗?我知道将参数列入白名单是避免危险发送的一种解决方案。有没有更好的方法来解决这个问题?

4

1 回答 1

1

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

虽然很臭。一个小小的改进是使用controller_name辅助方法:

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

但这确实引出了一个问题,为什么你一开始就把这个怪物加在自己身上。既然它缺少一个身份,这甚至应该做什么 - 摧毁一切?

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

DELETE /things/1

由于 URL 中没有愚蠢的前缀,您可以使用以下命令生成它:

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

如果您确实需要动态生成路径,请使用多态路由助手而不是发送:

= link_to [:delete, controller_name], method: :delete, data: { confirm: delete_confirmation } do
  = fa_icon delete_icon, class: 'm-r-quarter', text: delete_text
于 2021-05-04T18:14:39.847 回答