【发布时间】: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="✓" />
<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="✓" />
他们正在调用相同的操作。虽然后续形式是可验证的:
<form class="new_promotion" id="new_promotion" action="/promotions?municipality_slug=gorizia" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓" /><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="✓" />
顺便说一句,它也运行。
但由于缺少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