使用 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”