如何解决具有多个其余端点的Brakeman重定向问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决具有多个其余端点的Brakeman重定向问题相关的知识,希望对你有一定的参考价值。
我目前正在研究一种在RoR中进行重定向的解决方案,因为我在lockman报告中看到一个错误,指出我必须以正确的方式修复重定向。我了解消息内容以及如何在一个控制器操作中解决该消息。但是现在我得到了以下内容。在新方法的实例化期间,我设置了HTTP_REFERER标头,该标头可以在create操作中使用。
这给了我一个Brakeman警告,可以在下面的link中找到
假设我得到了具有多个端点的以下控制器:
def new
@my_model_set = MyModel.new
@referer = request.env['HTTP_REFERER'] # We want to redirect to this referer after a create
end
def create
...
if @my_model_set.save
flash_message :success, t('notification.item_created', type: @my_model_set.model_name.human)
if params[:referer].present?
redirect_to params[:referer]
else
redirect_to admin_my_model_set_path
end
else
...
end
end
我已经尝试过使用RoR中的redirect_back
方法来解决此问题,但这使用的是我不想使用的create方法的引用链接。
if @my_model_set.save
flash_message :success, t('notification.item_created', type: @my_model_set.model_name.human)
redirect_back(fallback_location: admin_my_model_set_path)
else
...
end
代码中的主要问题是,您的用户(或攻击者为您的用户伪造链接)可以将params[:referer]
设置为任意值,方法是将?referer=https://malicious.site
附加到网址中。然后,您将重定向到该漏洞,这是一个开放的重定向漏洞。
[您也可能会争辩说referer
标头在技术上是用户输入,您将重定向到它,但是我想说在大多数情况下和现代浏览器中,这可能是可以接受的风险,因为攻击者实际上并没有一种利用它的方法(但可能取决于实际情况)。
类似情况下立即想到的一个解决方案是会话-但如果我正确理解的话,一方面是一个REST API,所以没有会话,另一方面,它仍然是不安全的攻击者从恶意域链接到您的#new
终结点。
我认为您应先验证域,然后再重定向到它。如果存在共同的模式(例如,如果所有这些都是yourdomain.com的子域),请对此进行验证。或者,您可以让用户先将其域注册,然后再重定向至该域(例如,请参阅OAuth2的工作原理,您必须先注册应用域,然后才能使用令牌将用户重定向至该域)。
[如果您的用户可能来自任何地方#new
,并且您想将他们发回任何地方-我认为这不是一个很好的要求,则可能不应该这样做,否则您应该仔细评估风险并如果出于某种原因想要自觉接受它。在大多数情况下,有一个更安全的解决方案。
以上是关于如何解决具有多个其余端点的Brakeman重定向问题的主要内容,如果未能解决你的问题,请参考以下文章
Woocommerce 如何从模板重定向挂钩中排除 myaccount 的子页面(端点)?