问题描述
我的代码中多次使用了以下部分 _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