【问题标题】:Rails 3 Authenticity tokens: How to prevent it from using spaces?Rails 3 Authenticity 令牌:如何防止它使用空格?
【发布时间】:2013-05-24 04:03:35
【问题描述】:

我正在使用 Rails 3 和 javascript 发出 POST 请求,因此我需要一个真实性令牌。但是,Rails 创建的令牌一直包含空格,我的 javascript URL 字符串中不能包含空格。这是我现在日志中的样子:

Started POST "/cart/update?authenticity_token=fjJJQc2gKBenzzAAqdvhprJxH2tnhYkyuZ9F+l+GFns=" for 127.0.0.1 at 2013-05-23 11:55:42 -0400
Processing by CartController#update as HTML
  Parameters: {"gift_card_amount"=>"undefined", "case_quantity"=>"", "bottle_quantity"=>"", "product_history_id"=>"1052981", "authenticity_token"=>"fjJJQc2gKBenzzAAqdvhprJxH2tnhYkyuZ9F l GFns="}
WARNING: Can't verify CSRF token authenticity

这是我的 HTML:

    <a href="javascript: void(0)" class="button-yellow">Add to Cart</a>
    <%= hidden_field_tag form_authenticity_token %>
    <script>
        window._token = '<%= form_authenticity_token %>';
    </script>

还有我的javascript:

$.post('/cart/update?authenticity_token=' + encodeURIComponent(window._token), ...

请注意,我尝试使用 encodeURIComponent,但这似乎不起作用。但是,问题仍然存在,我觉得它是 Rails 而不是 javascript。如何将 Rails 令牌更改为不包含空格? gsub for + 就像在 javascript 中一样?

【问题讨论】:

  • 真实性令牌是 base64 编码的。 + 符号在 base64 编码中有效,不代表空格。 URL do 中的+ 符号表示空格。因此,如果您需要将令牌作为 URL 参数发送,则需要对令牌进行 URL 编码。为避免此问题,您可以将令牌作为 POST 参数发送。不过@0x0uLL 的回答看起来是正确的做法。

标签: ruby-on-rails


【解决方案1】:

看起来您实际上应该在标头中发送 csrf 令牌,而不是将其作为参数发送。还要确保你的布局中有&lt;%= csrf_meta_tag %&gt;。查看this answer

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2013-12-07
    相关资源
    最近更新 更多