Rails - 如何向用 javascript 创建的表单添加 CSRF 保护?

     2023-03-10     260

关键词:

【中文标题】Rails - 如何向用 javascript 创建的表单添加 CSRF 保护?【英文标题】:Rails - How to add CSRF Protection to forms created in javascript? 【发布时间】:2012-01-20 03:59:48 【问题描述】:

我正在使用backbone.js,效果很好。但是我作为 javascript 模板创建的表单缺少 rails csrf 保护令牌。如何将它添加到我在 javascript 中创建的模板中?

【问题讨论】:

【参考方案1】:

我解决这个问题的最佳方法,在表单内:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

更新:

看起来form_authenticity_token 对于较新的 Rails 版本中的控制器是私有的。

如果你是这种情况,我的建议是:在控制器中声明一个变量,例如: @form_token = form_authenticity_token 并在您正在寻找的视图中使用它。

【讨论】:

它有效,但为什么呢? form_authenticity_token 不是控制器中的私有吗? 这不适用于我 Rails 4.2.2。我得到:undefined local variable or method 'form_authenticity_token' for #&lt;#&lt;Class:0x007ff80b1d36d8&gt;:0x007ff7eec39b58&gt; 嘿伙计们,看起来form_authenticity_token 对于富兰克林所说的控制器来说是私有的。我看到的建议是在控制器@form_token = form_authenticity_token 中声明一个变量并在视图中使用它。 这适用于我在 rails 4.2.5 中。注意:此表单是在 ERB 中生成的,而不是在 JS 中生成的。【参考方案2】:

如果您的布局中有 &lt;%= csrf_meta_tag %&gt; 并且您可以从 js 访问它,那么您可以使用 $('meta[name="csrf-token"]') 访问它

请参阅http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html,了解如何将 csrf 支持加入到每个主干请求中

【讨论】:

请参阅gist.github.com/3482636 了解另一个如何入侵此功能的示例。我不知道是否相同。 具体:$.ajax(data: authenticity_token: $('meta[name="csrf-token"]').attr("content"))【参考方案3】:

您可以将 csrf 标记添加到每个使用“发布”或“删除”的表单。这是在咖啡脚本中:

$ -> 
  for f in $("form")
    if f.method == 'post' or f.method == 'delete'
      $(f).prepend("<input type='hidden' name='authenticity_token' value='" + token + "'>")

确保您的布局中有 。它应该已经在标准的“应用程序”布局中,但如果您使用不同的布局,请添加它。

【讨论】:

token 声明在哪里? @suga_shane 写“确保你有&lt;%= csrf_meta_tags %&gt;”的意思是这个Rails 助手为你生成一个令牌并将它插入HTML head。令牌是&lt;meta&gt; 标记中的content 属性,名称为csrf-token【参考方案4】:

我在 Rails 6 应用程序的 Vue 组件中有一个表单。

令我惊讶的是,在 Vue 模板中包含一个名为 authenticity_token 的隐藏输入就足够了,并且在页面加载时,Rails 使用 CSRF 保护令牌填充了该值。

例如

<template>
  <div id="app">
    <form
      action="/submit"
      method="post"
      @submit.prevent="onSubmit"
    >
      <input
        type="hidden"
        name="authenticity_token"
        value=""
      >
      <!-- rest of form -->
    </form>
  </div>
</template>

渲染为:

<div id="app">
  <form action="/submit" method="post">
    <input type="hidden" name="authenticity_token" value="zl9PJiE...">
    ...
  </form>
</div>

【讨论】:

【参考方案5】:

Rails 4.2.2 不允许使用

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

来自您的 .js.erb 资产文件。

但是,您可以在 .js.erb 文件中创建表单,并在包含表单 .html.erb 文件的视图中使用 hidden_field_tag 帮助器生成令牌元素。由于此元素将在表单之外生成,您可以使用 jquery 将此元素附加到表单中。

案例研究:SweetAlert(第一个版本,似乎也解决了这个问题)

show.js.erb

$('.js-button-apply-offer').click(function(e) 
var urlOffer = $(this).attr('data-url-offer');
var modalParams = 
    type: 'warning',
    title: 'add file',
    text: '<p>Need to add a file before continuing</p>' // This is a hack for Sweet alert, solved in SweetAlert2 Consider upgrade
    +"<form action='"+urlOffer+"' id='formCustomCV' method='post' enctype='multipart/form-data' data-remote='true'>"
    + "<input type='file' name='custom_cv' id='fileToUploadAlert' accept='application/pdf'>\n"
    +"</form>",
    html: true,
    showCancelButton: true,
    confirmButtonColor: '#DD6B55',
    confirmButtonText: 'Send',
    cancelButtonText: 'Cancel',
    closeOnConfirm: false
  
swal(modalParams,
function()
  var form_token = $('#form_token');
  $('#formCustomCV').append(form_token).submit(); //update to submit using ajax
);

show.html.erb

<%= button_tag t('offers.offer.apply'),
  class: 'center-block btn btn-success js-button-apply-offer',
  id: "js-button-apply-offer",
  data: 
    url_offer: apply_talents_offer_path(@offer),
   
%>
<%= hidden_field_tag :authenticity_token, form_authenticity_token, id: :form_token %>

【讨论】:

如何在 Rails 中将 Javascript 对象转换为 JSON?

】如何在Rails中将Javascript对象转换为JSON?【英文标题】:HowtoconvertaJavascriptobjecttoJSONinRails?【发布时间】:2021-10-3105:17:48【问题描述】:我有一个部分Javascript对象,如下所示:_chart.js.erbchart:animation:<%=@animation%>,plotOptions:...这... 查看详情

Ruby on Rails 4:如何在 Rails Web 应用程序中包含 Javascript 文件?

】RubyonRails4:如何在RailsWeb应用程序中包含Javascript文件?【英文标题】:RubyonRails4:HowtoincludeJavascriptfilesinRailswebapplication?【发布时间】:2014-04-1309:51:18【问题描述】:我正在构建一个Rails4Web应用程序,我想在我的应用程序中包含... 查看详情

如何在 Rails 视图中将 Ruby 变量传递给 JavaScript 函数?

】如何在Rails视图中将Ruby变量传递给JavaScript函数?【英文标题】:HowtopassRubyvariablestoaJavaScriptfunctioninaRailsview?【发布时间】:2021-07-2302:47:19【问题描述】:我想知道在Rails视图中将变量传递给JavaScript函数的最佳做法是什么。现在... 查看详情

Rails如何检测是不是使用javascript / jQuery插入了部分

】Rails如何检测是不是使用javascript/jQuery插入了部分【英文标题】:Railshowtodetectifapartialwasinsertedusingjavascript/jQueryRails如何检测是否使用javascript/jQuery插入了部分【发布时间】:2012-10-0722:04:49【问题描述】:如何在javascript中检测当... 查看详情

Rails 动态 javascript 加载

】Rails动态javascript加载【英文标题】:Railsdynamicjavascriptloading【发布时间】:2018-10-1100:17:54【问题描述】:在RoR中,您如何通过ajax调用动态加载位于您自己的rails服务器中的.js文件?你如何定义.js文件的路径?我将尝试解释我要... 查看详情

如何在 Rails 3.1 上关闭自动样式表/javascript 生成?

】如何在Rails3.1上关闭自动样式表/javascript生成?【英文标题】:HowdoIturnoffautomaticstylesheet/javascriptgenerationonRails3.1?【发布时间】:2011-11-1401:00:00【问题描述】:我正在处理一个Rails3.1项目,但我不希望每次运行railsgeneratecontrollercon... 查看详情

在 Rails 中如何在使用 javascript_include_tag 之前检查 javascript 文件是不是存在

】在Rails中如何在使用javascript_include_tag之前检查javascript文件是不是存在【英文标题】:InRailshowtocheckifjavascriptfileexistsbeforeusingjavascript_include_tag在Rails中如何在使用javascript_include_tag之前检查javascript文件是否存在【发布时间】:2012... 查看详情

Rails - Ajax 与不显眼的 javascript Jquery UI 进度条

】Rails-Ajax与不显眼的javascriptJqueryUI进度条【英文标题】:Rails-AjaxwithunobtrusivejavascriptJqueryUIProgressBar【发布时间】:2013-10-1413:35:57【问题描述】:我想实现一个从JQUERYUI下来的进度条,并将最大值设置为用户给出的任何数字,并将... 查看详情

如何从javascript(nodejs)程序调用python,而不创建子进程

】如何从javascript(nodejs)程序调用python,而不创建子进程【英文标题】:Howtocallpythonfromjavascript(nodejs)program,withoutcreatingchildprocess【发布时间】:2019-06-2009:18:15【问题描述】:我在nodejs上运行硬件,并且我在python3中编写了机器学... 查看详情

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

】如何在ruby​​onrails中访问rails助手和嵌入资产javascript文件中的ruby​​?【英文标题】:HowdoIaccessrailshelpersandembeddedrubyinsideassetsjavascriptfilesinrubyonrails?【发布时间】:2012-05-0307:49:46【问题描述】:我有一个显示和隐藏div,单击... 查看详情

如何使用 Rails 代码/将变量传递给 .coffee javascript 文件?

】如何使用Rails代码/将变量传递给.coffeejavascript文件?【英文标题】:Howtouserailscode/passvariablestoa.coffeejavascriptfile?【发布时间】:2012-03-0217:07:12【问题描述】:在.coffee脚本中传递值的最佳方式是什么?将文件重命名为.erb会破坏我... 查看详情

Rails 4:如何将表单构建器对象传递给使用 javascript (jQuery) 更新的嵌套表单

】Rails4:如何将表单构建器对象传递给使用javascript(jQuery)更新的嵌套表单【英文标题】:Rails4:Howtopassaformbuilderobjecttoanestedformupdatedwithjavascript(jQuery)【发布时间】:2013-03-0310:38:27【问题描述】:我正在将一个工作应用程序从Rails2.3... 查看详情

如何在 Heroku 上的 Rails 4 中引用 javascript 中的图像

】如何在Heroku上的Rails4中引用javascript中的图像【英文标题】:HowtoreferenceimagesinjavascriptwithinRails4onHeroku【发布时间】:2014-03-0109:47:06【问题描述】:我正在尝试通过javascript链接图像。单击缩略图时,较大的图像会变为相应的图像... 查看详情

Rails如何在Javascript中获取表中每个对象的值?

】Rails如何在Javascript中获取表中每个对象的值?【英文标题】:RailshowtoGetvalueinJavascriptofeachobjectintable?【发布时间】:2018-06-0318:01:10【问题描述】:这是我的桌子:<tbody><%@productos.eachdo|producto|%><tr><td><%=producto.... 查看详情

如何在 Rails 6 中要求自定义 JS 文件

...描述】:我目前正在尝试Rails6.0.0.rc1,它似乎已将默认的javascript文件夹从app/assets/javascript移动到app/javascript。application.js文件现在位于app/javascript/packs。现在,我 查看详情

如何将 json 数据从 ruby​​ 控制器传递到 javascript (Rails 6.1)?

】如何将json数据从ruby​​控制器传递到javascript(Rails6.1)?【英文标题】:Howtopassjsondatafromrubycontrollertojavascript(Rails6.1)?【发布时间】:2021-08-2710:46:47【问题描述】:我正在尝试将一些json数据从我的数据库传递到前端,以便我可以... 查看详情

Rails - 将信息从视图传递到 Javascript

】Rails-将信息从视图传递到Javascript【英文标题】:Rails-PassinformationfromviewtoJavascript【发布时间】:2014-08-1714:18:28【问题描述】:我想开始使用websockets。Ireadallthedocs什么都懂,但遗漏了我需要的东西:如何将信息从视图传递给JS?... 查看详情

如何创建类似于 javascript 节流/去抖动功能的 Rails/Ruby 方法

】如何创建类似于javascript节流/去抖动功能的Rails/Ruby方法【英文标题】:HowtocreateaRails/Rubymethodsimilartojavascriptthrottle/debouncefunction【发布时间】:2015-11-2206:54:11【问题描述】:在我们的应用程序中,我们公开了一个回调路由以供外... 查看详情