相同的形式 return 不同的 CSRF 行为

identical forms return different CSRF behaviours

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

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

两者都呈现。但我现在才注意到 push_new 表格中的 none 包含一个 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==" />

在一种情况下,操作会运行并且 returns 在其 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;" />

顺便说一句,它也运行。

但由于缺少authenticity_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 调用 'binded' 是否以某种方式跳过身份验证过程?
c) 我如何确保令牌存在于表单中(或被忽略,因为页面在上游受访问控制)?

误报。

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

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

javascript 个库可以访问后

Processing by PromotionsController#confirm_budget as JS

并且不需要调用 CSRF