如何将 CSRF 令牌从服务器传递到客户端?

2024-01-29

这听起来可能是一个愚蠢的问题。我想澄清这一点。如果首先将令牌发送给客户端并且客户端发回相同的令牌,csrf 令牌如何帮助识别跨站请求?恶意客户端不会得到服务器的响应吗?

如果我们在发送令牌时检查来源,那么令牌检查的事情是不是显得多余?

我们如何确保服务器只会向授权客户端提供令牌,以及将令牌从服务器传输到客户端的最佳实践是什么?

我曾问过一个相关问题here https://stackoverflow.com/questions/50713068/how-to-generate-csrf-token-in-reactjs-and-send-to-play-framework/50713330但需要更深入地了解它。所以在这里问一个不同的问题。

希望得到一些答案并举例说明。

先感谢您


CSRF 基本上是指攻击者通过浏览器中 cookie 的工作方式来利用用户的现有会话。根本问题是,无论请求来自何处(哪个来源,即域),都会随请求发送 cookiefrom,唯一重要的是它去了哪里to。因此,如果有用户登录到应用程序(具有会话 cookie),攻击者可能会尝试让该用户访问他的恶意网站,攻击者可以从该网站使用用户的凭据向应用程序域发出请求(通过完全将用户发布到应用程序,或者更巧妙地通过创建 ajax 请求)。

请注意,这仅适用于应用程序中的身份验证基于浏览器自动发送的内容(最明显的是会话 cookie)的情况,但例如基本的 http 身份验证或客户端证书身份验证也可能存在漏洞。此外,CSRF 仅适用于更改某些内容(状态或数据)的请求。

有一个重要的因素在发挥作用,同源策略(SOP)就是浏览器。有点简单,这意味着如果从一个域(或更准确地说:源)下载某些内容,则另一个域将无法访问。

因此,为了防止上述攻击并防止攻击者在自己的域上让用户向用户登录的应用程序发送不需要的请求,可能有几种不同的策略。

同步器令牌

应用程序生成一个 csrf 令牌,将其存储在用户的会话(服务器端)中,并将其发送到客户端,例如将其写入隐藏字段中的每种表单中,或者写入 Javascript 可以读取的单个字段中并添加到请求中。这是可行的,因为其域中的攻击者无法使用用户会话中的有效令牌创建表单或请求,而且攻击者也无法从应用程序页面读取令牌。当然,攻击者可以尝试下载申请表来获取令牌,但随后他需要凭据。攻击者需要有效的用户会话和相应的 csrf 令牌。攻击者可能有自己合适的帐户来登录,但无论如何他都可以执行操作。或者他可能拥有 csrf 令牌,但未经身份验证,或者权限较低的帐户。但他不能两者兼得,这就是重点。

因此,这种保护基本上验证了请求是否来自实际由合法应用程序而不是其他人呈现的源。

请注意,在这种情况下,在 cookie 中设置令牌是没有意义的,因为 cookie 将像会话 cookie 一样自动发送。

重复发帖

另一种策略是生成令牌,并将其设置为客户端的 cookie。然后,客户端从 cookie 中读取令牌,并发送相同的令牌作为请求标头。服务器只比较请求头和cookie中是否包含相同的token。这是可行的,因为攻击者无法从不同来源设置的 cookie 中读取应用程序令牌(请参阅上面的 SOP),但合法域上的应用程序可以。因此发送请求的客户端有效地证明了它正在合法的应用程序域上运行。这样做的好处是应用程序是无状态的,不需要会话。缺点是安全性稍差。

(有趣的是,这种情况下的令牌甚至可以在客户端生成,它仍然有效,因为攻击者在自己的域上无法设置或读取应用程序域 cookie,但它肯定不太安全,因为它是在浏览器。)

检查引用者或来源

正如您正确指出的那样,另一种策略可能是检查请求的引用者或来源。它基本上可以工作,但被认为不太安全。虽然双重发布对于许多应用程序来说被认为足够安全,但引用/来源检查大多不是。我认为它有很强的历史元素,但它确实is不太安全。

这个问题有很多方面,我想到了一些:

  • 发送引用/来源标头可以预防 http://geekthis.net/post/hide-http-referer-headers/由攻击者在他自己的域上进行。因此应用程序不会知道它是一个不同的域 - 它只是没有信息。您当然可以以需要引用者和/或来源的方式实现它,但这会导致潜在的错误和问题,即浏览器由于某种原因不发送它等。
  • 在某些情况下,Referer 和 origin 可能是伪造的。例如,旧的易受攻击的浏览器插件(Java、Flash...还有人记得 Flash 吗?)允许设置任何标头,攻击者只需要在受害者浏览器中安装其中一个 - 每个人都有它们。
  • 浏览器扩展还可以设置/修改标头,因此攻击者可能会尝试让受害者用户安装他的恶意扩展。
  • Origin 仅由现代浏览器设置。现在问题已经不大了,大多数人都使用同时设置引用者和来源的浏览器。

因此,出于这些原因,简单地检查引用/来源并不是很可靠,应该采取另一层保护。

同站点 cookies

A new invention by Google in Chrome is the SameSite attribute to cookies (in addition to the already existing and widespread httpOnly and secure cookie attributes). As of now, it is only supported by Chrome and not other browsers. [See update below!]

如上所述,根本问题是 cookie(即会话 cookie)根据请求目标而不是源发送到服务器。这意味着,如果attacker.com向用户提供一个页面,并且该页面从浏览器向legitapp.com发送post请求,则legitapp.com设置的任何cookie都将被发送到legitapp.com。因此,如果是登录legitapp.com的用户访问attacker.com,则现有会话就可以被利用。

这被改变了SameSite cookie 属性 https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/,这使得在源域与目标域不同的情况下不会发送 cookie。它可以设置为“严格”或“宽松”,这基本上决定了 GET 请求行为,但其中任何一个都会阻止 CSRF 非 GET 请求。

2023 年更新:

上述所有内容仍然适用,除了 SameSite 获得主流采用外,所有主流浏览器现在都支持此属性。现在应该将 SameSite 设置为宽松或严格,除非有充分理解的理由不这样做。松懈携带风险多一点 https://portswigger.net/web-security/csrf/bypassing-samesite-restrictions,但提供更好的用户体验。对于许多站点或应用程序,仅 SameSite 可能就足以实现 CSRF 保护,但请确保您完全了解相关风险。

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

如何将 CSRF 令牌从服务器传递到客户端? 的相关文章

  • Node.js:将 repl 挂接到远程节点服务器

    假设我有一个节点服务器在 mysite com 上运行 有没有办法设置该服务器以便我可以使用节点的repl api http nodejs org docs latest api repl html to securely从我的本地计算机连
  • Hapijs 在一个连接上同时使用 Http 和 Https

    New to Hapijs http hapijs com 并尝试使用它来创建一个应用程序 该应用程序对所有请求使用 HTTPS 并将 HTTP 重定向到安全连接 问题是应用程序进入 HTTPS 模式没有问题 但如果我将 URL 更改为 H
  • CSRF 失败:来源检查失败 - http://localhost:8000/ 与任何可信来源不匹配

    请帮我解决问题 我正在构建一个由 Django Rest Framework 和 ReactJS 组成的应用程序 我使用了视图集 my error 响应数据 detail CSRF Failed Origin checking failed
  • 为什么 iframe 请求不发送 cookie?

    兄弟部门创建了一个 HTML 文件 该文件实际上是少数 iframe 的支架 每个 iframe 都会调用一个托管在 Web 服务器上的报告 其参数略有不同 调用的报告将向未经身份验证的用户显示登录表单 或向已经过身份验证的用户显示报告内容
  • 将授权放在服务层而不是Web API层

    我正在使用 NET Core Web API 构建 REST API 我的控制器只是将请求转发到服务层并返回结果 HttpPost nameof Create public async Task
  • 在java中设置Process对象的安全性

    有人可以告诉我如何限制通过进程对象访问系统属性吗 如果我通过进程对象运行以下代码 我可以抛出安全异常吗 System getProperty user home 请告诉我如何为流程对象配置证券 在ProcessBuilder类文档中 环境方
  • Symfony 2 SecurityContext 类已弃用

    当我尝试访问 symfony demo 上的 app example 时 出现以下错误 错误 Symfony Component Security Core SecurityContext 类是 自 2 6 版本起已弃用 并将在 3 0 中
  • 当 .NET 项目开源时,谁应该拥有用于签署 .NET 程序集的私钥? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 更具体地说 是一个类库程序集 我最初的想法 让一些指定的管理员进行所有程序集签名 但是 当错误修复和新版本被编写时 二进制文件最终将依赖于它们的
  • 是否可以执行扩展名为 file.php.jpg 的 PHP?

    网站合法文件image upload php用于上传文件89471928047 php jpg这是简单的文件上传表单 将 tmp 文件复制到同一图像文件夹 他们如何设法执行它并通过它上传其他文件 有人知道这怎么可能吗 PHP version
  • 最好的通用摘要函数?

    在 2009 年编写一个普通的新应用程序时 就安全性和性能而言 最合理的摘要函数是什么 随着情况的变化 我如何在未来确定这一点 When similar https stackoverflow com questions 116684 wh
  • 在 C# .net 中如何使用 RSA 和许可证提供程序类进行许可?

    我想为简单的控制台应用程序提供许可证 我使用 RSACrypttoServiceProvider 类来加密和解密 我还想使用 LicFileLicenseProvider 类来为我的应用程序授予许可证 如何继承LicFileLicenseP
  • 无法读取未定义的属性“isLoggedIn”

    此代码用于添加产品 然后添加到购物车和订单 并在后端使用 mongodb 创建 pdf 实际上 session isLoggedIn 是在 auth js 中定义的 检查该代码 但仍在 app js 中它给出了此错误 应用程序 JS代码 c
  • 一个 Guice 就绪的安全框架?

    有没有人见过一个为与 Guice 一起工作而编写的框架 或者一个将现有安全系统 即 Acegi 与 Guice 集成的库 到目前为止我发现了以下内容 http code google com p warp security http cod
  • 正确使用 EncryptedSharedPreferences

    Android 最近发布了 EncryptedSharedPreferences 它自动加密 SharedPreferences 键 值数据 虽然这很好 但我发现我可以简单地连接 API 调用并检索解密的值 除了在调用 EncryptedS
  • python:PyPi公共模块:如何确定是否安全?

    我已经完成了我的 python 3 应用程序 它正在使用 PyPi 的多个公共模块 然而 在我将其部署到我公司的企业 将处理客户的凭据并访问第 3 方 API 之前 我需要尽职调查确保它们既安全又安全 我必须执行哪些步骤 验证 PyPi 模
  • 使用鼠标检测的反验证码

    我想知道是否可以为仅使用 javascript 的表单创建一个安全的人体检测机制 不使用验证码 来检测鼠标移动 因为 jquery 或操作系统代码都可以移动鼠标 我是这么告诉的 这是我的计划 使用 jQuery 我可以检测鼠标是否已移动 然
  • .NET 中是否有内置函数可以对密码进行哈希处理?

    我看到这个问题加密 散列数据库中的纯文本密码 https stackoverflow com questions 287517 encrypting hashing plain text passwords in database 我知道我
  • Symfony2 Secure by IP 不起作用

    在我的 Symfony 2 3 1 Security YML 中 我有这一行 安全 yml access control path mysecurearea roles IS AUTHENTICATED ANONYMOUSLY ip 0 0
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • 保护 REST 和 JSON

    我想利用 RESTful 架构构建提供 JSON 数据的 Web 服务 但我只想要我自己的客户端应用程序可以从我的网络服务请求 基本上 我的 Web 服务包含不供公众使用的敏感数据 但我想以这种方式构建它 以便我可以构建连接到我的 Web

随机推荐

  • 从 XSD 生成 Go 结构

    最近打算用Go做一个项目 我的问题是 给定一个 XSD 文件 如何在 Go 中自动生成结构来表示 XML 元素 它类似于使用 xjc 从 XSD 生成 java 类 那么Go中有没有任何工具或包可以做到这一点呢 提前致谢 看起来它可能需要一
  • 从外部连接到 docker 容器中的 Postgresql

    我在 Docker 容器的服务器上有 Postgresql 如何从外部 即我的本地计算机 连接到它 我应该应用什么设置来允许这样做 您可以通过这种方式运行 Postgres 映射端口 docker run name some postgre
  • 将 java 系统属性传递给 ant 测试

    我让 ant 使用以下代码执行 jar
  • 轮播引导程序中的拉伸图像

    我正在使用 Bootstrap 4 那里有一个带有图片的轮播 图像一直显示拉伸 不知道出了什么问题 carousel margin bottom 4rem position relative carousel caption bottom
  • 在非常大的树上执行 DFS 的最佳方法是什么?

    情况是这样的 应用世界由数十万个状态组成 给定一个状态 我可以计算出一组 3 或 4 个其他可到达的状态 一个简单的递归可以构建一个状态树 它会变得非常大且非常快 我需要从根状态到该树中的特定深度执行 DFS 以搜索包含 最小 状态的子树
  • Dalvik 和 Android 工具链可以带来哪些优化?

    我正在开发一个高性能 Android 应用程序 一款游戏 虽然我首先尝试编写代码以提高可读性 但我喜欢在脑海中保留一幅幕后发生的事情的图片 通过 C 我对编译器能为我做什么和不能做什么有了相当好的直觉 我正在尝试为 Java Android
  • 使用 std::vector 调用 std::lock ()

    我想将以下代码替换为std lock for mutex m mutexes m gt lock 无论如何我可以调用std lock 在那些给定的互斥体上std vector
  • 如何在 ActiveSupport::TestCase 中存根方法

    In RSpec我可以像这样存根方法 allow company to receive foo 300 我怎样才能存根一个方法ActiveSupport TestCase 我有一个这样的测试 class CompanyTest lt Act
  • 对文件中所有奇数行求和的 Pythonic 方法

    我正在学习 Python 以便参加研究生院的编程分班测试 这实际上是我为了感受它而编写的第一个小脚本 我的背景主要是C 和PHP 但是我在测试中不能使用任何一种语言 我的测试脚本读取以下文本文件 test file1 txt 偶数行包含样本
  • 应该如何创建一个可能抛出异常的 akka actor?

    我正在将一个项目从 scala Actor 迁移到 Akka Actor 我曾经有过类似的情况 如果某个系统资源不可用 MyActor 的构造函数可能会抛出异常 var myActor MyActor null try myActor ne
  • 如何制作基本的 FullCalendar 自定义视图

    下面的代码来自 FullCalendar 的自定义视图 https fullcalendar io docs views Custom Views 文档 这似乎是一个很好的开始 但是对于像我这样的新手来说 拥有一些呈现最简单的自定义视图 带
  • 仅将最后一个 shell 命令的标准输出放入 Python 变量中[重复]

    这个问题在这里已经有答案了 prova sh 包含 bin bash echo Output that I don t want echo Output that I don t want echo Output that I don t
  • java.text.ParseException:使用 Clock.systemUTC() 时出现无法解析的日期错误[重复]

    这个问题在这里已经有答案了 我在解析日期时遇到解析错误 java text ParseException 无法解析的日期 2021 06 17T05 49 41 174Z 无法解析的日期 2021 06 17T05 49 41 174Z 我
  • 使用 dgtsv_ 或 sgtsv_ 求解 A*X = B 类型的方程

    我正在尝试求解 SWIFT 中的 A X B 类型的线性方程组 我已经能够使用基于 LU 分解的算法来做到这一点 该算法消耗 O N 2 内存 由于我的数组通常很大 10000 个样本或更多 因此我正在研究 LAPACK 它具有一些特定于三
  • 登录 OS X,验证 iOS 和 OSStatus -9809

    我正在使用苹果的安全框架 https developer apple com library mac documentation Security Reference SecurityFrameworkReference 我能够在 OS X
  • 如何让 bash 将 stderr 重定向到 >( 命令替换)?

    我可以很好地将标准输出重定向到命令重定向 echo stdout gt 2 echo stderr gt gt rev stderr tuodts 但是当我尝试将 stderr 重定向到另一个时 它似乎通过了 stdout 通道 echo
  • Git:如何使用多个存储库?

    我有一个远程只读 git 存储库A 我已将其克隆到本地文件系统中 A定期更新 每次更新后我都会将更新的代码拉取并合并到我的系统中 我想与我的团队成员就以下文件进行协作A 为此 我创建了一个新的远程存储库B 我如何管理同步B与我的本地存储库
  • 避免在终端/cmd 上运行 FFmpeg

    I m using FFmpeg for a small project so I built a GUI basic application for video editing here is the image 一切工作正常 但我只是想
  • 如何使用 WPF 将文本换行到标签中?

    我有一个TextBox和一个标签 单击按钮后 我执行以下代码 label1 Content textbox1 Text 我的问题是 如何启用标签的文本换行 一行上可能显示太多文本 如果是这种情况 我希望它自动换行为多行 The Label控
  • 如何将 CSRF 令牌从服务器传递到客户端?

    这听起来可能是一个愚蠢的问题 我想澄清这一点 如果首先将令牌发送给客户端并且客户端发回相同的令牌 csrf 令牌如何帮助识别跨站请求 恶意客户端不会得到服务器的响应吗 如果我们在发送令牌时检查来源 那么令牌检查的事情是不是显得多余 我们如何