带有参数 [: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
我有以下部分 _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