使用 render_to_string 时创建的真实性令牌不同

Posted

技术标签:

【中文标题】使用 render_to_string 时创建的真实性令牌不同【英文标题】:Authenticity Token being created differently when using render_to_string 【发布时间】:2013-07-30 23:00:43 【问题描述】:

我正在通过render_to_string 生成一个小表单,由于某种原因,CSRF 令牌没有正确生成(即它与标题不同,用户在提交时已注销,以及“无法验证CSRF 令牌”在日志上)。以下是相关代码:

控制器:

def publish
  @question = @event.questions.find(params[:id])
  @question.update_attribute(:published, true) unless @question.published?
  Pusher[@event.to_param].trigger('new_question', question: render_question)
  redirect_to event_path(@event)
end


private
  def render_question
    render_to_string('questions/_unanswered_question', locals: question: @question, layout: false)
  end
  def fetch_event
    @event ||= current_user.events.find(params[:event_id])
  end

我正在使用 Pusher,但您可以假设这只是使用此 javascript 在页面上呈现:

$("#questions").append(data.question); // data is what I send from Pusher.

最后,被渲染的部分:

.answer
  = form_for [@event, question, question.answers.new] do |f|
    %h2
      = question.title

    %ul
      - (1..5).each do |n|
        - if question.send("answer_#n").present?
          %li
            = f.radio_button :option, n, id: "q_#question.id_answer_option_#n"
            = f.label question.send("answer_#n"), for: "q_#question.id_answer_option_#n"

    %p
      = f.submit "Answer"

这很好用,无需附加到页面,而是在布局中呈现。请注意,这不是远程表单。

【问题讨论】:

你能发布你的application.html.erb文件代码吗?需要头部 <html><head>this part</head><body>... 或者你能告诉我是否有 crf_token 标签吗? csrf_meta_tags 存在。 您可以发布将用户注销的请求的参数吗?您可以在请求之后在日志文件中找到发送的参数。 【参考方案1】:

看起来您正在使用 ajax 生成表单,然后将其添加到 Dom。为每个请求生成新的 csrf 令牌。据我所知,您必须使用标题中可用的 csrf 令牌,并使用 js 将表单中的令牌替换为它。

应该是这样的:

success: ()->
  parameter = $("meta[name=csrf-param]").attr("content")
  token     = $("meta[name=csrf-token]").attr("content")
  question  = $(data.question).find("[name="+parameter+"]").val(token)

目前我没有电脑可以先测试,所以希望我是对的:/

【讨论】:

以上是关于使用 render_to_string 时创建的真实性令牌不同的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 django 的 render_to_string 对单引号 (') 进行编码

指定格式:使用 render_to_string 忽略“xml”

如何使用 render_to_string 在 lib ruby​​ 类中渲染部分内容

如何将变量从模型传递给 render_to_string?

控制器中的 render_to_string 部分格式错误

如何使用 Perl 和 GD 创建透明的真彩色 PNG?