如何确保 Rails API 免受 CSRF 的保护?

2023-11-24

我一直在使用 REST API 开发 Rails 应用程序,以便从移动应用程序进行访问。

它运作得很好。当用户从移动应用程序登录时,他会得到auth_token他在将来的 API 请求中使用它。问题是 API 也可以通过路径 /api/v1/... 从 Web 访问,因此,必须保护它免受 CSRF 的影响。

I have BaseApiController继承自的类ApplicationController具有protect_from_forgery“启用”。这是例子:

class Api::V1::BaseApiController < ApplicationController
  # ...
end

class ApplicationController < ActionController::Base
  protect_from_forgery
  # ...
end

现在,当我向 API 发出非 GET 请求时,auth_token,我的请求成功完成,但在日志中我可以看到著名的WARNING: Can't verify CSRF token authenticity。如果我删除protect_from_forgery从我的BaseApiController,我没有收到任何警告(显然),但是我的 API 很容易受到 CSRF 攻击(我制作了一个简单的 HTML 表单,可以在没有任何情况下成功地跨域更改数据)protect_from_forgery).

我的问题是:如何确保我的 API 保持安全,同时在执行非 GET 请求时删除警告?

这是我提出的解决方案之一,但它看起来更像是一种黑客并执行一个额外的数据库查询:

class Api::V1::BaseApiController < ApplicationController
  # ...
  def verified_request?
    super || User.where(authentication_token: params['auth_token']).count > 0
  end
end

有关该项目的更多详细信息:Rails 3.2.14、Devise、AngularJS。可以找到该项目的源代码here.


您可能会看到人们认为 CSRF 不是 API 请求的问题(一开始就没有状态,那么有什么可以劫持的呢?),因此有些人建议采用以下方法来简单地消除警告:

skip_before_filter :verify_authenticity_token, :only => [:your_method]

然而,有一些评论称可以使用以下方式提交 CSRF:text/plain使用各种基于 Flash 和 Java 的方法。我相信这就是不久前在 Rails 中发布安全补丁的原因:http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

无论如何,可以在这里找到实际检查真实性令牌的良好解决方案:警告:无法验证 CSRF 令牌真实性

它涉及实际设置请求中的标头。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确保 Rails API 免受 CSRF 的保护? 的相关文章

  • AuthenticationContext 不包含 AcquireToken 定义?

    我尝试使用 Microsoft Power BI REST API 但没有取得多大进展 因为我对该 API 的经验不是很丰富 据我了解 身份验证上下文是身份模型活动目录的一部分 我三次检查它是否被引用到项目 其余方法运行属性 但没有名为 A
  • 使用 gem 添加辅助方法

    我找到了很多有关添加表单辅助方法的信息 请参阅我的其他问题之一 但我找不到有关添加辅助方法的任何信息 就好像它们是在application helper rb 我尝试过复制application helper rb从 Rails 应用程序到
  • 无法从heroku访问API整个JAR已部署

    JAR已成功部署到heroku 来自命令行的消息 偏僻的 https minmint herokuapp com https minmint herokuapp com 部署到 Heroku 我的代码片段 RestController Re
  • 在environment.rb中设置的常量在开发模式下消失

    了解 Rails 缓存如何工作的人可以真正帮助我 这是嵌套在 Rails Initializer run 块内的代码 config after initialize do SomeClass const set SOME CONST SOM
  • jruby-openssl 中已初始化常量

    当在 Torquebox 上运行我的 Rails 应用程序时 我得到了很多 already initialized constant 警告源自gems jruby openssl 0 8 2 lib shared jruby openssl
  • 对于所有 mime 类型,仅respond_to format.js

    我有一个响应 format js 的控制器 但是 大多数请求假设旧的 format html 仍然存在并抛出 404 异常 如何捕获控制器上的所有 MIME 请求并将它们仅重定向到 format js 这是当前控制器的操作 def sear
  • 安装heroku toolbelt后出现Ruby错误

    我正在 win 7 32 位系统上使用 Heroku 但我没有管理员权限 我已经下载并安装了heroku工具带如下http community webfaction com questions 11803 heroku toolbelt h
  • Rails 3,i18n:将 html 标签插入文本

    我的问题正是中描述的问题这个问题 https stackoverflow com questions 2543936 rails i18n translating text with links inside 唯一的区别 我使用的是 Rai
  • 将 csrf 令牌传递给 Stripe

    我正在使用 stripe js 进行条纹支付 我需要设置一个回调 webhook 来接收来自 stripe 的请求 由于 webhook 是通过 stripe 发布的 我已将其标记为csrf excempt 提出这个观点有什么风险吗csrf
  • 如何在 Rails 应用程序中选择性地跟踪方法及其文件访问?

    对于 Rails 应用程序 我想重载或修改 Kernel load 以便它打印出完整路径 例如puts gt File expand path File dirname FILE File basename FILE 对于加载的每个 Rai
  • MonkeyPatching ActiveJobs

    我在 ActiveJobs 的猴子修补部分遇到问题 我在 config initializers extensions arguements rb 中有以下代码 module ActiveJob module Arguments TYPE
  • ActiveStorage::FileNotFoundError 但文件确实存在

    我正在开发这个 Rails 6 0 21 应用程序 ruby 2 5 5 并使用 puma 3 12 2 作为开发 Web 服务器和具有本地磁盘服务的 ActiveStorage 我的应用程序时不时地出错ActiveStorage File
  • 使用 Figaro 和 Secrets.yml 管理环境变量

    我有一个 Rails 4 1 应用程序 我正在尝试组织我的环境变量 截至目前 我的 config 文件夹中有一个 Secrets yml 文件 我还安装了费加罗宝石 我的目标是将所有环境变量放在 application yml 未签入 gi
  • 获取类别和子类别的所有产品(rails、awesome_nested_set)

    正在开发一个电子商务应用程序 我试图解决以下问题 我通过 Awesome nested set 插件实现了我的类别 如果我通过选择一个类别列出我的文章 一切正常 但对于某些链接 我想显示一个类别的所有产品及其子类别的产品 这是仅适用于一种类
  • SetCookie 标头未存储

    我目前正在制作一个 Web 应用程序 其中 API 为 Node express js 前端为 Vue js 对于身份验证 我设置了 JWT 并通过 cookie HttpOnly 发送值 SetCookie 位于 Chrome Firef
  • 找不到关联,Rails 3

    class Membership lt ActiveRecord Base belongs to role belongs to user end class User lt ActiveRecord Base has many roles
  • 如何在Rails 中使用highlight.js?

    我正在尝试在我的 Rails 应用程序中使用语法突出显示和highlight js height js 的说明如下 https github com isagalaev highlight js https github com isaga
  • 使用 Rails3-autocomplete gem 时出现“自动完成方法不存在”错误

    在我的rails应用程序中 我尝试使用rails3 jquery autocomplete gem 我在 Gemfile 中包含了以下行 gem Rails3 jquery autocomplete 并提供捆绑安装及其在 gems 中列出
  • 如何使用 Rspec 来测试使用 Paperclip 的模型是否正在验证上传文件的大小?

    该模型 class Attachment lt ActiveRecord Base belongs to narrative attr accessible description user id narrative id has atta
  • 如何保持 python 3 脚本 (Bot) 运行

    不是母语英语 抱歉 英语可能很蹩脚 我也是编程新手 您好 我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器来创建机器人 经过几天的努力 它有效 只有 1 个问题 而我却被这个问题困扰了 如果您需要检查 这是我正在使

随机推荐

  • 左外连接和右外连接哪个更好?

    我们可以通过这两种方式得到相同的结果 Table 1 LEFT OUTER JOIN Table 2 Table 2 RIGHT OUTER JOIN Table 1 如果我们能得到相同的结果为什么要使用右外连接 哪一个更好 正如其他人已经
  • pdfBox - 签名有效性复选标记在 Acrobat reader 中不可见

    我正在使用此作为参考向 pdf 添加视觉签名 https stackoverflow com a 27940667 7103795 我能够正确打印详细信息 但在 Acrobat 中打开 pdf 时 它不会显示绿色勾号 尽管它写着 已签名且所
  • 如何在 Quill 编辑器中预填充 http 链接?

    使用 Quill 编辑器添加链接时 我必须包含协议 否则链接将被视为相对链接 当有人单击添加链接时 我希望该字段预先填充http 所以当用户输入google com它将创建一个链接到http google com代替http myapp n
  • Apache VirtualHost 403 禁止

    我最近尝试使用 Apache 设置测试服务器 该网站必须在域下运行www mytest com 我总是得到一个403 Forbidden错误 我使用的是 Ubuntu 10 10 服务器版本 文档根目录位于 dir 下 var www 以下
  • 如何使用msbuild创建nuget包而不重建项目?

    我想设置一个包含构建 测试和部署阶段的 CI CD 管道 我可以在构建阶段构建我的项目 msbuild src MyProject csproj t Restore msbuild src MyProject csproj p Config
  • 尝试导入错误:“firebase/app”不包含默认导出(导入为“firebase”)

    我尝试使用 React 进行 firebase 身份验证 但它显示错误 Attempted import error firebase app does not contain a default export imported as fi
  • gpus_ReturnGuiltyForHardwareRestart 崩溃

    应用程序在presentFrameBuffer中崩溃 在前台运行时 没有发生中断 它没有在第一帧中崩溃 它绘制了一段时间然后突然崩溃 我没有具体的重现步骤 但似乎与绘制特定的内容有关 但我仍然没有通过应用程序报告 openGL 错误 包括在
  • x86 BSWAP 指令 REX 不遵循 Intel 规范?

    我一直在使用 NASM 和 GAS 汇编 和反汇编 BSWAP x64 指令 并且都汇编指令BSWAP r15 as 490FCF以十六进制表示 反汇编器也将其反汇编为相同的指令 指令的 REX 前缀 49 因此设置了 REX W 位 位
  • 导出到 Excel 时,SSRS 不支持 CanGrow 属性

    我在 SSRS 报告中有一个表 表格单元之一包含订单中零件的描述 这些描述的长度可能会有所不同 因此我将 CanGrow 属性设置为 True 当我尝试将报告导出到 Excel 时 我希望如果文本长度超过单元格的宽度 那么单元格的高度将会增
  • $(window) 绑定 hashchange 如何检查部分哈希更改?

    我在学习Google Ajax Crawlable I use window bind hashchange控制ajax页面加载 我的网址如下 domain com keywords num 1 有两种改变 domain com apple
  • 在 OpenGLES 中让精灵正确面对相机

    我有一款或多或少是 2D 的游戏 但以 3D 渲染 摄像机悬停在 2D 游戏场上方 与完全垂直的角度倾斜约 20 度 从而为其提供一点 3D 视角 我有一些精灵需要渲染为完美的正方形 因为它们代表球形物体 我的第一种方法将四边形渲染在 2D
  • STL - 以下代码有什么问题?

    include stdafx h include
  • PDF 到 Github 风格的 Markdown

    我有一个 PDF 格式的项目描述 如果我能以某种方式设法在 github 网站上预览它 而不是单击 查看原始数据 并下载它 我会非常高兴 我以为可能有一个从 pdf 到 github 风格的 markdown 的转换器 但没有找到 再次声明
  • 字典应用程序的数据库设计

    目前我想开发移动设备的词典应用程序 词典本身使用离线文件 数据库来翻译单词 它只翻译两种语言 例如英语 西班牙语词典 我脑子里有一个简单的设计 这将是两个表 英语表和西班牙语表 每个表包含 word id id 它将作为其他表的外键 词 词
  • 重命名 cassandra 集群名称 1.2.6 时出错

    我在具有单个节点的集群中使用 cassandra 1 2 6 我正在尝试使用以下说明重命名集群 Cassandra 集群名称不匹配 完成所有步骤后 当我更改 cassandra yaml 文件后启动 cassandra 时 我继续出现相同的
  • matplotlib 再次显示图形

    使用 matplotlib 时 from matplotlib import pyplot as plt figure plt figure ax figure add subplot 111 ax plot x y figure show
  • 废弃的命名信号量未释放

    当 C 程序持有命名信号量时 当应用程序提前终止 例如按 Ctrl C 或关闭控制台窗口 时 它似乎不会被释放 至少在该进程的所有实例都终止之前不会 对于命名互斥体 在这种情况下会引发 AbandonedMutexException 但对于
  • 如何让 Subversion(或任何程序)执行定期提交?

    我想配置我的计算机 以便每半小时自动提交我正在处理的程序 我正在使用 svn 存储库 因此即使它只是一个每 30 分钟运行一次 svn ci 的脚本也没关系 问题是我不知道该怎么做 有人可以告诉我 或者指导我去做一些事情 让我让这个定期提交
  • 在新选项卡中打开链接[重复]

    这个问题在这里已经有答案了 我为我正在做的一个项目创建了一个网站 网站内容中有一些可以访问的外部网页的链接 同时 当用户单击其中一个链接时 他将被带到指定的链接 并且他将不再位于当前页面上 我想要做的是 当用户单击链接时 单击的链接中的指定
  • 如何确保 Rails API 免受 CSRF 的保护?

    我一直在使用 REST API 开发 Rails 应用程序 以便从移动应用程序进行访问 它运作得很好 当用户从移动应用程序登录时 他会得到auth token他在将来的 API 请求中使用它 问题是 API 也可以通过路径 api v1 从