相同的形式 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="✓" />
<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==" />
在一种情况下,操作会运行并且 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="✓" />
顺便说一句,它也运行。
但由于缺少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
相同 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="✓" />
<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==" />
在一种情况下,操作会运行并且 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="✓" />
顺便说一句,它也运行。
但由于缺少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