【问题标题】:identical forms return different CSRF behaviours相同的表单返回不同的 CSRF 行为
【发布时间】:2021-01-04 12:15:59
【问题描述】:

同一类的两个动作具有使用相同相同形式的视图(迄今为止尚未重构)。此表单多次出现以更改一个属性的值。它还通过 XHR 提供表单的刷新和页面上后续表单的输入。

<%= form_for(@push_new, url: confirm_budget_promotions_path, remote: true) do |f| %>
 [...]

两者都渲染。但我现在才注意到,push_new 表单中没有一个包含authenticity_token。随后的形式。呈现的 HTML 有

<form class="new_pushbudget" id="new_pushbudget" action="/promotions/confirm_budget?municipality_slug=gorizia" accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden" value="&#x2713;" />

<form class="new_pushbudget" id="new_pushbudget" action="/promotions/confirm_budget?municipality_slug=gorizia" accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden" value="&#x2713;" />

他们正在调用相同的操作。虽然后续形式是可验证的:

<form class="new_promotion" id="new_promotion" action="/promotions?municipality_slug=gorizia" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="rWkPuaVzAD5ECAPY6dUJLKw1daj8nGuNhX/G0GhfSrWEkSReGkbGI/SB9pksL5XcpLi50SqJoLxqbw2oknOX8w==" />

在一种情况下,操作运行并在其 XHR 响应中返回一个替换表单

<form class="new_pushbudget" id="new_pushbudget" action="/promotions/confirm_budget?municipality_slug=gorizia" accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden" value="&#x2713;" />

顺便说一句,它也运行。

但由于缺少authentity_token,其他操作不会进行。

Started POST "/promotions/confirm_budget?municipality_slug=gorizia" for ::1 at 2020-09-17 16:08:49 +0200
Processing by PromotionsController#confirm_budget as HTML
Parameters: {"utf8"=>"✓", "pushbudget"=>{"shop_id"=>"110", "shop_available"=>"287", "budget"=>"1.4"}, "commit"=>"Invia", "municipality_slug"=>"gorizia"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 4ms (ActiveRecord: 0.0ms)

a) 尽管表单呈现 data-remote="true" Rails 将其作为 HTML 处理。
b) 这是完全出乎意料的行为。 XHR 调用是否以某种方式“绑定”到父页面以跳过身份验证过程?
c) 我如何确保令牌出现在表单中(或被忽略,因为页面是上游访问控制的)?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4.2


    【解决方案1】:

    误报。

    一个表单正在从缓存中的页面呈现。

    第二个是实时调用页面,由于一个怪癖而没有调用 javascript 库。

    一旦可以访问 javascript 库

    Processing by PromotionsController#confirm_budget as JS
    

    并且不需要调用 CSRF

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      相关资源
      最近更新 更多