使用 CSP + localStorage 保护单页应用程序免受 CSRF 和 XSS 的影响

2024-03-25

我有一个单页应用程序,包含敏感内容,并且需要保护。这个问题专门针对 XSS 和 CSRF 攻击。

解释:很多地方都提出了建议,例如here http://michael-coates.blogspot.ca/2010/07/html5-local-storage-and-xss.html在存储身份验证令牌时在 localStorage 之上使用 cookie。在回答另一个问题时也提供了一个非常好的解释here https://stackoverflow.com/questions/35291573/csrf-protection-with-json-web-tokens/35347022#35347022.

根据这些答案,对于安全内容,建议使用带有“httpOnly”和“secure”选项的 cookie 以避免 XSS;并自己实现 CSRF 保护(类似于ASP.NET 中的防伪令牌 https://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks)(请注意,我不在 Asp .net 上,而是在 java 堆栈上)。

认为这些博客和对话有些陈旧,随着时间的推移,情况已经发生了一些变化。现在与内容-安全-策略标头 [CSP] https://content-security-policy.com/通过严格的策略,可以显着降低 XSS 攻击的风险。 CSP 也是现代浏览器很大程度上支持 http://caniuse.com/#feat=contentsecuritypolicy。考虑到CSP的XSS安全性,现在我觉得使用localStorage而不是cookie来避免CSRF是一个不错的选择。

问题:您认为使用“LocalStorage + CSP(无需手动实现)”有什么缺点/安全漏洞吗

Over

Cookies [httpOnly 且安全] + “手动”实施 CSRF 防伪令牌?

考虑:

除了 CSP 响应标头之外,您还可以考虑按照建议仍然支持 X-XSS-Protection 标头here https://stackoverflow.com/questions/31413005/x-xss-protection-vs-csp.

您可以认为该站点是 HTTPS,具有 HSTS、HPKP 安全标头的实现。


XSS

是您的应用程序中的一个漏洞,允许攻击者让您的常规访问者未经授权地执行第 3 方控制的 JavaScript。

保护形式必须来自过滤所有用户提供的输入(即使它存储在数据库中),然后通过转义在给定上下文中产生问题的所需字符将其输出到输出上下文中。

身份验证令牌是 XSS 攻击的众多潜在目标之一,将它们存储为 http_only 有助于保护它们,但到目前为止还不足以阻止攻击者。

CSRF

跨站点请求伪造本质上是应用程序中的一个漏洞,授权用户点击例如第三方网站,使他们在不知不觉中对您的应用程序执行更改。

传统的保护涉及生成一个“密钥”,您可以在每个可以进行更改的表单的隐藏字段中输出该“密钥”(并转换具有所述保护的表单中进行更改的每个按钮)。 密钥必须经常更改,以便攻击者无法知道它们、猜测它们等,同时密钥保持足够长的时间,以便用户有时间填写表单。 通常,它们可以与会话一起生成,但您不会将它们存储在客户端上,仅以每种形式输出它们,并在接受帖子的输入之前检查它们是否存在。

使用本地存储来存储该 CSRF 密钥(如果您是sure你的所有访问者都支持它)是一种可能性,但如果所有浏览器都支持它的假设不正确(它们都会生成 CSRF 违规),你就会增加问题

HTTP_ONLY

意味着浏览器被指示不要让 javascript 访问此 cookie。 这在一定程度上有助于最大限度地减少 XSS 攻击对此 cookie 的访问(但不会影响攻击者感兴趣的其他内容)

Secure

意味着浏览器被指示仅在使用 https 连接时将此 cookie 发送到服务器(并且不会通过非 https 连接将其发送到同一服务器(可能会在途中被拦截)。

把它放在一起

使用身份验证令牌作为 cookie,并带有 https_only 和 secure 选项。 如果您确定所有客户端都能够进行本地存储,则可以将 CSRF 密钥添加到本地存储,并添加提取该密钥的 javascript,并将其以每个表单和每个进行更改的按钮发送到服务器。如果您将两把钥匙分开,您将获得两全其美的效果。 但是:您仍然需要检查 CSRF 密钥在每个更改任何内容的请求中是否存在且有效。

就我个人而言,我觉得这还为时过早,而且目前在服务器生成的每种表单中使用传统的 CSRF 密钥比必须依赖于浏览器的假设和/或提供与旧的东西相同的后备机制更容易维持2个方法。

CSP

CSP 很好,但到目前为止还不是在每个浏览器中都适用。如果您依靠它来阻止 XSS,我会将其视为“腰带和吊带”方法,而不是唯一的解决方案。原因很简单:有一天,您负载过多,决定使用 CDN ...哎呀,现在需要允许 CDN 加载图像、脚本等,而现在 XSS 之门对该 CDN 的任何其他用户开放。 .. 也许打开那扇门的人甚至没有考虑到 XSS 是他们需要担心的事情。

此外,上下文相关的输出过滤并不难编写,并且它使得在任何地方输出任何内容都变得更加安全,并且让过滤器负责编码(例如,您的 URL 将在需要的地方进行 urlencoded,您的 html 标签的属性将得到正确转义,您的文本可以包含 & 和

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

使用 CSP + localStorage 保护单页应用程序免受 CSRF 和 XSS 的影响 的相关文章

随机推荐

  • 为什么冒泡排序最好情况的时间复杂度是O(n)

    我按照书中使用的方法推导了冒泡排序在最佳情况下的时间复杂度算法2 2 但结果是 O n 2 以下是我的推导 希望大家帮我找出哪里错了 public void bubbleSort int arr for int i 0 len arr le
  • 让 Kotlin 序列化器与 Retrofit 配合使用

    我无法让 Kotlin Serializer 与 Retrofit 一起使用 我在用com jakewharton retrofit retrofit2 kotlinx serialization converter 0 5 0与 Retr
  • 如何用networkx绘制社区

    如何使用 python networkx 绘制其社区的图表 如下图所示 图片网址 https data graphstream project org talks CSSS2012 media Community Structure2 jp
  • Pentaho Data Integration(最新版本)-未检测到 MySQL 驱动程序

    我是这个工具的新手 我正在尝试创建与数据库的 MySQL 连接 但是当我按下 测试 按钮时 它会显示以下消息 Error connecting to database MySQL configuracionesEF org pentaho
  • 将 UITableView 作为容器视图嵌入到 UIViewController 中

    我想添加一个文本字段和发送按钮 该按钮粘贴在 uitableview 的底部 类似于聊天应用程序 我遇到过关于将 UITableView 作为容器视图嵌入到 UIViewController 中的评论 然而 他们似乎缺乏如何实现这一目标的例
  • 自应用签名后文档已被更改或损坏 itext 5.5.11

    基本上 我收到错误 自应用签名以来文档已被更改或损坏 我按照 itext 网站的示例并根据我的情况进行了调整 准备好要签名的文档 添加append模式 因为可以 已经签署的文件 调用 Web 服务来签署哈希值 将签名哈希添加到准备好的文档中
  • 如何在 Django 中验证电子邮件地址? [复制]

    这个问题在这里已经有答案了 我编写了一个用于将电子邮件添加到时事通讯库的函数 在我添加检查发送电子邮件的有效性之前 它一直运行得很好 现在每次我都会收到 错误的电子邮件 回复 有人能看到这里有任何错误吗 使用的正则表达式是 b w w w
  • 在 Pandas DataFrame 中拆分列列表

    我正在寻找解决以下问题的好方法 我当前的修复不是特别干净 我希望从您的见解中学习 假设我有一个 Panda DataFrame 其条目如下所示 gt gt gt df pd DataFrame index 1 2 3 columns Col
  • 两个3D点云变换矩阵

    我试图猜测两个 3D 点云之间的刚性变换矩阵是哪个 这两个点云是 来自 kinect 的关键点 kinect keypoints 来自 3D 对象 盒子 的关键点 object keypoints 我尝试过两种选择 1 实现寻找刚性变换的算
  • 为什么 PyPy 翻译这么慢?

    将 pypy 实现转换为 c 文件并在具有 2G mem 和 Intel Core2 2GHz CPU 的现代笔记本电脑上构建 pypy c 需要几个小时 我知道这是一个 CPU 密集型任务 但是有必要这么慢吗 有没有机会或者空间来减少计算
  • Rails 3 时区错误

    我在 Rails 3 beta 中的时区支持方面遇到了困难 我想知道这是否是一个错误 或者我是否做错了什么 他就是问题所在 gt Time zone Madrid it is GMT 2 gt Madrid gt c Comment new
  • 如何测试一个对象是否是一个可以接受 jQuery 中的 .each() 的集合?

    如何测试一个对象是否是一个可以接受 jQuery 中的 each 的集合 提前致谢 试长度 if my class length gt 1 http jsfiddle net AlienWebguy QhFDN http jsfiddle
  • WOPI 主机未呼叫

    我想知道为什么我的 WOPI 主机没有被呼叫 我通过类似于以下内容的 HTML 页面启动我的主机 https github com Microsoft Office Online Test Tools and Documentation b
  • warpPerspective和perspectiveTransform有什么区别?

    我使用了四组点来获得透视变换矩阵 然后使用warpPerspective变换矩阵A到矩阵B Mat A 中的点 a 我想在 mat B 中获得新点的位置 但是warpPerspective不能那样做 同时perspectiveTransfo
  • 使用Maven安装Bower组件并全局安装Bower

    我使用 NPM 在全球范围内安装了 Bower 在我的 Maven 项目中 我有一个 Bower json 文件 我使用 exec maven plugin 在构建时安装 Bower 组件 但是它失败了 因为它 无法在目录中运行程序 bow
  • 如何在子类中键入注释重写的方法?

    假设我已经有一个带有类型注释的方法 class Shape def area self gt float raise NotImplementedError 然后我将对其进行多次子类化 class Circle def area self
  • Azure 服务总线主题订阅的锁定持续时间重要性

    我一直在研究服务总线队列和主题的锁定持续时间和更新锁定机制 然而 目前尚不清楚锁定持续时间对于主题订阅到底意味着什么 例如 如果我有一个主题 GameScoreUpdate 并且它有多个订阅者 因此 此主题的任何消息都将传递给所有订阅者 现
  • Redmine vs Chiliproject [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在从实验性安装切换Redmine http www redmine org以供公司广泛使用 我们确实使用了一些我们必须使用的插件 例如 re
  • 安装了邪恶的Emacs。我该如何开始呢?

    出于好奇 我想尝试一下 emacs evil 这是我到目前为止所做的 在 Windows 7 上安装 emacs 24 进展顺利 创建了一个 emacs 文件C Users name AppData Roaming emacs d 结束的地
  • 使用 CSP + localStorage 保护单页应用程序免受 CSRF 和 XSS 的影响

    我有一个单页应用程序 包含敏感内容 并且需要保护 这个问题专门针对 XSS 和 CSRF 攻击 解释 很多地方都提出了建议 例如here http michael coates blogspot ca 2010 07 html5 local