防范 CSRF 和 XSS(散列 + 加密)

2023-11-27

安全。如今,如果没有通过开发人员使用的框架或开发人员自己编程适当的安全性,任何应用程序都无法在互联网上生存。我目前正在开发一个 RESTful API 以使用 Bearer 令牌身份验证进行工作,但一直在阅读有关 XSS 和 CSRF 攻击的内容。

问题1)根据我所读到的内容,我发现使用基于令牌的身份验证的 RESTful API 的应用程序容易受到 XSS 和notCSRF 如果令牌存储在浏览器的 localStorage/sessionStorage 中而不是 cookie 中。这是因为,要使 CSRF 发挥作用,应用程序必须使用 cookie。我对么?

但现在令牌存储在 localStorage/sessionStorage 中,应用程序变得容易受到 XSS 攻击。如果应用程序的任何部分不清理输入(例如,框架对 Angular 输入进行清理,但也许我正在使用的某个第三方库默认情况下不清理输入),那么攻击者就可以注入恶意代码代码窃取其他用户的令牌,然后通过模拟他们发出经过身份验证的请求。

问题2)有一种方法可以在使用 RESTful API 的应用程序中防范这两种攻击。我碰到这个帖子。该文章的要点是,在用户登录并请求不记名令牌时,让服务器也返回一个httpOnlycookie 的作用是,比如说,CSRFProtectionCookie。我相信本文中的解决方案非常强大并且提供了强大的保护。再说一遍,我说得对吗?你有什么看法?

我的应用程序和我在上面的帖子中提到的方法的版本

上面帖子中提到的方法需要我坚持CSRFProtectionCookie在某种数据库中。我不想那样做。我不希望每次向 API 发出经过身份验证的请求时都会访问数据库。相反,我能做的是:

Login

  1. 用户使用用户名和密码向令牌端点发送 POST 请求
  2. 授权服务器验证用户凭据并开始使用某些声明构建 JWT。
  3. 作为 JWT 构建的一部分,它还生成一个随机字符串,hashes它,并将其添加为,比如说,csrf向 JWT 索赔。
  4. 另外,接下来服务器设置一个httpOnly名为 cookieXSRF-TOKEN其值是相同的随机字符串,但是加密的这次。
  5. 将响应返回给浏览器。浏览器获取不记名令牌作为响应正文和XSRF-TOKENcookie 已设置。

经过身份验证的请求

  1. 应用程序通过添加 JWT 不记名令牌来调用经过身份验证的端点Authorization标头。浏览器自动发送 cookie。

  2. 服务器解密cookie以获取纯文本。然后,服务器使用 JWT 中存在的哈希值验证该纯文本。

  3. 如果匹配,则继续请求。否则,返回未经授权的响应。

我认为这可以防止 CSRF 和 XSS。因为发出经过身份验证的请求都需要令牌和 cookie (httpOnly)。

Question是的,这消除了将任何内容保存到数据库的需要(或者是吗?我是否遗漏了一些漏洞?)。但是,在每个用户请求上解密和验证哈希值的开销是多少?是否比数据库 I/O 开销更大?另外,欢迎对此方法或其他方法提出任何其他建议!

谢谢 :)


回答问题1

从我读到的内容来看,如果令牌存储在浏览器的 localStorage/sessionStorage 而不是 cookie 中,那么使用基于令牌的身份验证的 RESTful API 的应用程序很容易受到 XSS 而不是 CSRF 的攻击。这是因为,要使 CSRF 发挥作用,应用程序必须使用 cookie。我对么?

或多或少是正确的。仅使用 cookie 进行身份验证且没有任何 CSRF 保护的应用程序将容易受到 CSRF 的攻击,因为 cookie 会自动包含在所有请求中。

但现在令牌存储在 localStorage/sessionStorage 中,应用程序变得容易受到 XSS 攻击。

这并不是说应用程序容易受到 XSS 攻击,而是身份验证令牌容易受到 XSS 攻击。如果您的身份验证令牌发送为http-only,那么 JavaScript(以及 XSS 攻击)就无法读取该值。

回答问题2

我认为这篇文章很好地解释了如何使用会话 cookie 和 CSRF 令牌。由于文章有点长,让我尝试总结一下:

  1. Use an http-onlycookie(理想情况下也secure— 作者没有提到 — 这会阻止浏览器在 http 请求(仅 https 请求)上发送 cookie验证令牌。这样,cookie就无法被JavaScript读取,从而无法在XSS攻击中被窃取。
  2. 使用会话存储来存储跨站请求伪造保护令牌。这样做的好处是一些 JavaScript 代码必须读取该值并将其放入请求中。在某些第三方、受感染的站点上运行的恶意代码将无法从本地存储读取 CSRF 令牌,因此无法创建有效的请求。

本文还详细介绍了如果您的静态资源与 REST 端点位于不同的域中,如何设置跨域标头。

然而,你的做法与文章所说的背道而驰。您将身份验证令牌放入 localStorage 中,并将 CSRF 令牌放入 cookie 中。我建议将其翻转回来,因为身份验证令牌比 CSRF 令牌更重要,并且http-only securecookie 比 localStorage 更难被坏人获取。

对你的方法的评论

上面帖子中提到的方法需要我坚持CSRFProtectionCookie在某种数据库中。我不想那样做。我不希望每次向 API 发出经过身份验证的请求时都会访问数据库。

在这里,你正在沿着一条好的道路思考。您所描述的将被称为“无状态 CSRF 令牌”。

您对“经过身份验证的请求”的方法看起来不错。我不完全确定您需要加密 CSRF 令牌值,但这并没有什么坏处。

这消除了将任何内容保存到数据库的需要(或者是吗?我错过了一些漏洞吗?)

你说得对,没有漏洞。

但是,在每个用户请求上解密和验证哈希值的开销是多少?是否比数据库 I/O 开销更大?

I/O 通常比 CPU 密集型计算慢得多,即使对于加密之类的计算也是如此。也就是说,如果您真的担心它,则必须进行衡量(当然,说起来容易做起来难)。

最后的想法...

请记住,通过将 CSRF 令牌存储在 JWT 声明中,CSRF 令牌将与 JWT 令牌一样有效。即使您向客户端发送新的 JWT 令牌,旧令牌和 CSRF 令牌仍然有效。对于短期令牌(例如 10-60 分钟)来说,这不是一个问题,但是将 CSRF 令牌存储在服务器端某处的好处之一意味着您可以拥有用于超级敏感操作的一次性令牌。 (此外,如果您需要撤销尚未过期的 JWT 令牌,您还需要将该状态存储在服务器端的某个地方。但现在我们陷入了另一个兔子洞......)

实际上没有任何特定的框架能够完全防止 XSS 漏洞,因为它们可以以多种不同的方式表现出来。也就是说,您的网络应用程序可以使用Content-Security-Policy标头有助于防止 XSS 攻击。 CSP 标头可用于告诉浏览器允许从哪些域加载资源(例如 JavaScript 文件)。它甚至可以用来阻止内联 JavaScript 运行(这是 XSS 的主要攻击媒介之一)。

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

防范 CSRF 和 XSS(散列 + 加密) 的相关文章

  • 尝试使用 REST API 公开对象时出现“访问被拒绝。提供的范围未经授权”错误

    我正在尝试对 Google Cloud Storage 存储桶中的各个对象设置权限 以使它们可公开查看 如下Google 文档中指示的步骤 https cloud google com storage docs access control
  • REST 中子资源和路径变量冲突?

    设计路径解析可能含糊不清的 REST API 是否被认为是不好的做法 例如 GET animals id Returns the animal with the given ID GET animals dogs Returns all a
  • 向 JMeter REST 请求添加身份验证

    我今天花了大部分时间试图让它发挥作用 但仍然没有成功 我有一个简单的案例 我只想向我的网络服务发送一个 GET 请求 但无论我做什么 我都无法对其进行身份验证 我尝试过授权管理器 Cookie 管理器 标头管理器的各种组合 但无济于事 我把
  • .Net Web API 抛出异常/返回响应/返回 404/400 响应的错误响应?

    我正在使用 net web api 开发一些宁静的 Web 服务 对于某些情况 我需要向客户端返回 404 NotFoundStatus 或 400 BadRequest 看起来框架中有很多方法可以做到这一点 下面列出一些我所知道的方法 是
  • 对多个路径使用 Single Jersey REST 类

    我已经开始使用 JAX RS 开发 REST 服务 使用 Jersey 非常简单 但是我在使用 Spring MVC 和 Jersey REST 类时遇到的一个区别是 Spring 支持忽略根路径元素并在方法级别具有单独的路径映射 因此 如
  • Laravel 中的 PATCH Ajax 请求

    是否可以向 Laravel 发出 Ajax PATCH 请求 或者我是否仅限于 POST Laravel 在输入隐藏字段中使用 PATCH 但是 我没有使用表单元素 只是在单击时 通过 Ajax 请求 应该部分更新记录的按钮 这条路线会是什
  • 在应用程序中注册API

    通过 django rest framework 我正在使用DefaultRouter 我想为多个应用程序提供 API 所以我的问题是我能否以 django 方式执行此操作 并将我的路由器注册放入每个应用程序 URLconf 中 并让它们显
  • 从 QueryDSL 谓词对象中获取参数

    我使用带有 Spring REST 端点的 QueryDSL 谓词对象来检索和查询参数值 GetMapping subjectId students RolesAllowed Roles PLATFORM ADMIN Roles USER
  • 为移动应用程序创建 API - 身份验证和授权

    Overview 我正在寻找为我的应用程序创建一个 REST API 最初 主要目的是供移动应用程序 iPhone Android Symbian 等 使用 我一直在研究基于 Web 的 API 的身份验证和授权的不同机制 通过研究其他实现
  • 当用户在springboot中调用注册休息API时如何获取oAuth2访问令牌?

    目前我正在研究 Springboot 安全性 这对我来说相当新 我跟着youtube视频教程 当我使用以下代码片段时 我成功获取了 oauth2 access token SpringBootApplication public class
  • 从 Office 365 日历获取所有事件

    我需要获取 Office 365 日历中的所有事件 当前 GET 请求 https graph microsoft com v1 0 users https graph microsoft com v1 0 users userPrinci
  • 是否应该在 REST API PUT 请求中传递资源及其相关资源的所有字段?

    假设我有一个票证和评论资源 门票可以有很多评论 在您的更新端点中HTTP PUT api tickets
  • 无法读取未定义的属性“isLoggedIn”

    此代码用于添加产品 然后添加到购物车和订单 并在后端使用 mongodb 创建 pdf 实际上 session isLoggedIn 是在 auth js 中定义的 检查该代码 但仍在 app js 中它给出了此错误 应用程序 JS代码 c
  • REST - 获取随机数 GET 还是 POST?

    应该如何在 REST 中正确实现随机数生成器 GET RANDOM or POST RANDOM 服务器每次返回不同的随机数 我可以看到这两种方式的论点 我想说这与返回的包含当前时间的页面相同 其中许多都是使用 GET 完成的 抽象地说 获
  • RESTful API,如果查询字符串不够长怎么办?

    我们有产品资源集合 products 我们希望过滤此集合以仅返回具有特定列表之一的成员class id的 例如 GET products classes 100 101 102 这应该返回具有列出的任何类的产品成员的集合 我们遇到的问题是
  • 遭受xss攻击后如何恢复站点?

    最近我正在研究XSS攻击以及它们对网站的破坏性有多大 让我惊讶的是 网络 even SO 充满了关于如何防止xss攻击但没有相关资源说明如何在网站受到 xss 攻击后恢复网站 我遇到过一些事情 比如 将备份网站代码上传回服务器 下载整个网站
  • Spring Boot 应用程序中的 Vaadin 23 Rest-API 和 UI

    我使用 Vaadin 23 3 5 开发了一个小型应用程序 到目前为止 我仅将 Spring Boot Security 与默认的 LoginView 结合使用来进行身份验证 然后使用 MainLayout 来浏览我的应用程序 但现在我需要
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • REST 将多个输入传递给 GET 方法

    我在 RAD 中部署了一个简单的基于 REST 的应用程序 使用以下方式访问简单的 URLhttp localhost
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity

随机推荐

  • 竞技编程中的快速输入/输出

    我在竞争性编程竞赛的解决方案中多次遇到过这个特定的代码片段 我了解此代码的基本用途来克服时间限制 但我想更深入地了解它 我知道 unistd h 可以访问系统调用包装函数 例如 fork pipe 和 I O 原语 读 写等 如果有人可以解
  • 如何创建 GUI 并以编程方式对 Cocoa 事件做出反应?

    我发现了如何以编程方式在 Cocoa 中创建一个窗口 但不知道如何对事件做出反应 该窗口不对退出请求或按钮单击做出反应 我尝试添加以下控制器并使用 setDelegate setTarget 但没有运气 interface AppContr
  • 使用 hibernate 以编程方式验证架构

    在大多数项目中 运行你的方法java app模式验证是使用该配置 使用 spring 时 spring jpa hibernate ddl auto validate 我遇到了一个问题 我需要在运行期间的特定时间验证我的架构 有什么方法可以
  • 如何在 Python Git hook 中使用 raw_input() ?

    我正在为 Git 编写一个预提交钩子 它运行 pyflakes 并检查修改文件中的制表符和尾随空格 Github 上的代码 我想通过请求用户确认来覆盖钩子 如下所示 answer raw input Commit anyway N y if
  • try catch 块的成本是多少?

    好多少是 if condition try something catch SomeEx ex 而不是这个 try if condition something catch SomeEx ex 当我进入 try 块时 JVM 实际上会做什么
  • 动画按钮允许用户交互不起作用

    我在 NSObject 类的代码中创建了一个 UIbutton 它控制 UIViewController 类中的游戏 该按钮在游戏的大部分时间都工作正常 但在某个时刻我希望按钮淡入 淡出 一旦淡入 淡出开始动画 按钮就不再具有交互性 我已经
  • 从 json 创建 DynamoDB 表

    我想知道是否可以从表定义 json 本身创建 dynamodb 表 我研究了 aws cli 工具 但找不到任何方法来执行此操作 只是想知道是否可能 aws dynamodb create table file tabledenifisio
  • 如何将 mySql SQL 脚本转换为 MS SQL 脚本?

    我必须将客户 MySql 数据库架构 数据迁移到 MS SQL SERVER 2008 最后我收到了 70 Mb SQL 文件 其中包含与 MSSQL 不兼容的 mySQL 方言 DROP TABLE IF EXISTS kladr CRE
  • Facebook 登录与 CSRF 状态令牌不匹配的问题

    我做了一些搜索 但没有找到与我的问题相关的任何内容 我目前正在尝试对我的网站实施 Facebook 登录 但由于 htaccess mod 重写 URL 我在登录身份验证方面遇到了问题 该代码工作完美 如果我在没有 mod 重写规则的情况下
  • c从 R 中的字符串绑定动态列名

    我想将一列绑定到数据框 并使用从字符串动态分配的列名称 y attribute Survived cbind test data y attribute NA 这会导致新列添加为y attribute而不是所需的Survived属性以字符串
  • Mockito 空指针异常

    我遵循了 hoaz 的建议 但是 我遇到了空指针异常 RunWith MockitoJUnitRunner class public class GeneralConfigServiceImplTest InjectMocks privat
  • Perl 可以“静态”解析吗?

    An 文章名为 Perl 无法解析 形式化证明 正在巡视 那么 Perl 是否在 运行时 或 编 译时 决定其解析代码的含义 在我读过的一些讨论中 我的印象是这些论点源于不精确的术语 所以请尝试在答案中定义您的技术术语 我故意没有定义 运行
  • 如何将列表中的随机值分配给 pandas 数据框中的列?

    我正在 Bigquery 中使用 Python 并且有一个大型数据帧 df 大约 700 万行 我还有一个列表 lst 包含一些日期 例如给定月份的所有日期 我正在尝试在 df 中创建一个附加列 random day 并使用每行中 lst
  • HTTPS 到 HTTPS 重定向 Nginx

    如何将一个 HTTPS 重定向到另一个 HTTPS 我只有一个域的一个 SSL 证书 例如 如何重定向https example org to https example com 我已经尝试搜索谷歌和其他论坛 但没有发现任何效果 这非常容易
  • openapi 3.0 有效的最小值和最大值

    我有下面的模式定义来表示commission amount在我的 openapi 合同中 commissionAmount type number minimum 99999 99 maximum 99999 99 生成的代码 Valid
  • 我可以从实例访问类变量吗?

    我有这门课 class ReallyLongClassName static var 5 def instance method self ReallyLongClassName static var 1 有没有办法使用 self 变量访问
  • 使用 javascript 保持事件

    我真的很想知道当您点击 在移动设备上 或单击 在桌面设备上 表单提交 锚点 等时是否有任何方法可以执行功能 并保持一段时间而不使用 jQuery function clicked set some kind of timer or so f
  • 对分组中的“汇总”进行排序

    我发现与 group by 一起使用的 with rollup 选项非常有用 但它不适用于 order by 子句 有什么办法可以按照我想要的方式订购并计算小计吗 CREATE TABLE mygroup id int 11 default
  • 如何在 MATLAB 中一步加载 100 个具有相似名称和/或字符串的文件?

    我的目录中有 100 个 ASCII 文件 全部命名如下 int 001 ASCint 002 ASCint 003 ASC int 099 ASCint 100 ASC 我必须使用 importdata 将它们全部导入到 MATLAB 中
  • 防范 CSRF 和 XSS(散列 + 加密)

    安全 如今 如果没有通过开发人员使用的框架或开发人员自己编程适当的安全性 任何应用程序都无法在互联网上生存 我目前正在开发一个 RESTful API 以使用 Bearer 令牌身份验证进行工作 但一直在阅读有关 XSS 和 CSRF 攻击