- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
X-CSRF-Token
或 token 有什么区别在隐藏字段中?我认为 X-CSRF-Token
是在我使用 JavaScript/AJAX 时,但我不确定。
最佳答案
CSRF 保护有多种方法。
传统方式(the "Synchronizer token" pattern)通常涉及为每个请求设置唯一的有效 Token 值,然后在随后发送请求时验证该唯一值。通常通过设置隐藏的表单字段来完成。 token 值通常是短暂的并与该 session 相关联,因此如果黑客试图重用他们之前在页面上看到的值,或者试图猜测该值,他们很可能会失败。因此,只有来自您的应用程序的请求才能工作,而来自您的应用程序/域外部的伪造请求(也称为跨站点请求伪造)将失败。
缺点是它要求您的应用程序在所有 HTML 表单上设置此隐藏标记。这些页面现在必须由应用程序动态生成,而以前它们可能是静态 HTML。它还可以破坏后退按钮(因为您需要刷新表单以重新生成另一个唯一的 CSRF 值)。您现在还需要在服务器端跟踪有效 token 并检查所有请求是否使用有效 token 。这可能需要相当多的额外努力来实现和维护。
另一种方法(称为 the "Cookie-to-header token" pattern)是为每个 session 设置一次 Cookie,然后让 JavaScript 读取该 cookie 并设置自定义 HTTP header (通常称为 X-CSRF-TOKEN
或 X-XSRF-TOKEN
或只是 XSRF-TOKEN
) 具有该值。任何请求都会发送 header (由 Javascript 设置)和 cookie(由浏览器设置为标准 HTTP header ),然后服务器可以检查 X-CSRF-TOKEN
header 中的值是否匹配cookie header 中的值。这个想法是只有在同一域上运行的 JavaScript 才能访问 cookie,因此来自另一个域的 JavaScript 无法将此 header 设置为正确的值(假设该页面不易受到可以访问此 cookie 的 XSS 攻击) .即使是虚假链接(例如在网络钓鱼电子邮件中)也不会起作用,因为即使它们看起来来自正确的域,也只会设置 cookie 而不是 X-CSRF-TOKEN
header 。
这比 Synchronizer token 模式更容易实现,因为您不需要为每个表单的每次调用设置 token ,而且检查也相对简单(只需检查 cookie 与 header 匹配)而不是跟踪 CSRF token 有效性。您所需要的只是为每个 session 设置一个 cookie 为一个随机值。如果某些前端框架看到 cookie(例如 AngularJS does this),甚至会自动为您生成 header 。
缺点是它需要 JavaScript 才能工作(但如果您的应用程序基本上没有 JavaScript 就无法工作,这可能不是问题),而且它只适用于 JavaScript 发出的请求(例如 XHR 请求)- 常规HTML 表单请求不会设置 header 。对此的一种变体("Double Submit Cookie" pattern)将 X-CSRF-TOKEN
值放在隐藏的表单字段中,而不是放在 HTTP header 中,以解决这个问题,但仍然保持服务器端逻辑比传统的同步器 token 模式。但是应该注意的是 OWASP states some weaknesses with the Double Submit method ,当攻击者能够设置 cookie(这通常比读取 cookie 更容易)时,建议在这种情况下验证 CSRF token 。
此外,Synchronizer token 模式可以允许额外的控制来强制执行流程(例如,仅当应用程序认为您已发送有效请求以获取该表单时,才会设置隐藏字段 CSRF token )。
哦,一些安全扫描会发现 cookie 没有设置 HTTP-Only
标志,因此可以被 JavaScript 读取 - 但这是故意的,因为它需要能够被读取那!错误警报。您可能会认为,只要您使用像 X-CSRF-TOKEN
这样的通用名称,他们就会知道不要标记它,但经常看到它被标记。
关于security - CSRF 和 X-CSRF-Token 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34782493/
假设我的 Web 应用程序使用 CSRF token 防止 CSRF 攻击,此外,它使用 SSL 并防止 XSS 攻击。此外,出于这个问题的目的,假设它仅在最近的浏览器中使用并且它们没有错误。我可以使
很多人都在谈论实现 CSRF 来阻止对网页的跨站点攻击。但我认为破坏 CSRF 并向服务器发出请求非常容易。 那么它是如何工作的呢? 您从一个页面开始,呈现一个表单并使用 CSRF token 保留一
在阅读了许多有关 CSRF 的文档后,我仍然有点困惑。所以我希望有人可以向我解释一下: 假设我有一个仅供经过身份验证的用户使用的个人资料页面,比如说 abc.com/profile,它会显示我所有的私
我们基于 Angular 的 web 应用程序与在不同域和上下文路径上运行的企业门户集成。我正在使用基于 Spring Security 的 CSRF token 来验证传入的请求。该应用程序在本地完
我正在开发一个 Web API。身份验证是通过 cookie 进行的。所有端点通过JSON接收参数在请求正文中。 我需要实现 CSRF token保护他们?这怎么可能被利用呢?是否可以通过正常发送JS
我正在开发一个从 cookie header 解析 CSRF token 的应用程序。我想知道 CSRF token 是否使用 URL 安全字符进行 base64 编码(参见 https://simp
我知道当提交时表单中未包含 csrf token 时会发生此错误,但这次并非如此。 我正在尝试登录管理站点。管理员登录表单包含 csrf token ,我可以看到该 csrf token 的值与 cs
有没有办法对 Controller 的某些操作禁用 CSRF 验证,同时对其他操作保持启用状态? 就我而言,我有几个可配置的 Action 类,它们旨在注入(inject)到 Controller 中
我正在编写一个应用程序(Django,确实如此),我只想了解“CSRF token ”实际上是什么以及它如何保护数据。 如果不使用CSRF token ,发布数据不安全吗? 最佳答案 简单来说跨站请求
来自维基百科关于同源政策 https://en.wikipedia.org/wiki/Same-origin_policy The same-origin policy helps protect s
我在 Vue 环境中使用 axios 与用 Symfony 编写的网络服务对话。每个请求都需要设置一个 X-Auth-Token header 。该值存储在 auth_token cookie 中。
我想保护我的 REST 调用免受 XSRF 攻击。我正在做的是: 服务器在用户成功登录后向浏览器发送一个记录的 cookie。 在每个请求(GET、POST、DELETE)上,我将登录的 cookie
我知道这个问题以前有人问过。我已经尝试了人们给出的几乎所有选项,但我似乎无法解决它。我是一个完整的新手,所以请让我知道我哪里出错了。 我正在尝试编写一个简单的原始表单。到目前为止,我还没有实现任何身份
似乎 Laravel 5 默认将 CSRF 过滤器应用于所有非获取请求。这对于表单 POST 是可以的,但对于 POST DELETE 等的 API 可能是一个问题。 简单的问题: 如何设置没有 CS
当我从客户端向服务器发出 DELETE 请求时,我遇到了错误。 “CSRF token 已关联到此客户端”。响应代码:403 和响应头 { "cache-control": "no-cache,
to prevent CSRF attacks, a random CSRF secret has been generated. 以上内容来自 symfony: http://www.symfony
我正在使用 Django Rest Framework还有 django-rest-auth . 我有标准的 API 端点(/login、/logout、/registration...) 使用我的浏
这个问题在这里已经有了答案: OAuth2.0 Server stack how to use state to prevent CSRF? for draft2.0 v20 (3 个回答) 4年前关
我需要知道如何在 Impresspages cms 中禁用 CSRF 功能。我在之前的帖子中看到了一个可能的答案,但没有完全分类。当我的客户在 cleanwaterpartnership.co.uk
我正在使用 Django 1.7 和 django-rest-framework。 我制作了一个 API,它返回一些 JSON 数据并将其放入我的 settings.py REST_FRAMEWORK
我是一名优秀的程序员,十分优秀!