- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
据我所知,有两种方法可以防止 CSRF 攻击:1) token per session,和 2) token per request
1) 在第一种情况下,CSRF token 仅在用户 session 初始化时生成一次。因此用户一次只有一个有效 token 。
2) 在第二种情况下,每个请求都会生成新的 CSRF token ,之后旧 token 将失效。这使得利用该漏洞变得更加困难,因为即使攻击者窃取了 token (通过 XSS)它也会在用户转到下一页时过期。但另一方面,这种方法使 webapp 的可用性降低。这是来自 security.stackexchange.com 的一段很好的引述:
For example if they hit the 'back' button and submit the form with new values, the submission will fail, and likely greet them with some hostile error message. If they try to open a resource in a second tab, they'll find the session randomly breaks in one or both tabs
分析 Node.js 时 Express框架(基于 Connect )我注意到每个请求都会生成一个新的 CSRF token ,但旧的不会失效。
我的问题是:为每个请求提供新的 CSRF token 而不是使旧的无效的原因是什么?为什么不只为每个 session 生成一个 token ?
谢谢你,对不起我的英语!
最佳答案
CSRF token 是随机数。它们应该只使用一次(或长时间后安全使用)。它们用于识别和授权请求。让我们考虑两种防止 CSRF 的方法:
每个 session 固定一个 token :这样做的缺点是客户端可以将其 token 传递给其他人。这可能不是由于嗅探或中间人或某些安全漏洞造成的。这是用户的背叛。多个客户端可以使用相同的 token 。遗憾的是,对此无能为力。
动态 token :每当服务器和客户端之间发生任何交互或超时时, token 都会更新。它可以防止使用旧 token 和多个客户端同时使用。
动态 token 的缺点是它限制返回和从那里继续。在某些情况下,这可能是可取的,例如如果实现购物车,则必须重新加载以检查是否有货。 CSRF 将阻止重新发送已发送的表格或重复购买/出售。
细粒度的控制会更好。对于您提到的场景,您可以在没有 CSRF 验证的情况下进行。然后不要对该特定页面使用 CSRF。换句话说,处理每个路由的 CSRF(或其异常)。
更新
我只能想到单个动态 token 优于多个动态 token 的两个原因:
多个 token 确实更好,但至少有一个像上面那样的动态 token 。这意味着设计一个可能变得复杂的详细工作流程。例如看这里:
这些是访问其 API(表单提交等)的 token ,而不仅仅是登录。每个人都以不同的方式实现它们。除非有好的用例,否则不值得做。您的网页将大量使用它。更何况表单提交现在还不简单。
动态单 token 是最简单的,并且在库中很容易获得。因此可以随时随地使用。
多代币的优点:
顺便说一下,如果你想使用多个 token ,你现在有 OAuth2 库。
关于node.js - 为什么 Express/Connect 会在每次请求时生成新的 CSRF token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21645504/
我的 Web 应用程序在后端使用 Node.js 和 Express。当违反内容安全策略 (CSP) 时,报告 URI 报告空对象。我的后台代码如下: app.use(bodyParser.urlen
在服务器端提供静态服务的方式在 Express 中似乎非常简单: To serve static files such as images, CSS files, and JavaScript fil
var express = require('express'); var app = express(); 这就是我们创建快速应用程序的方式。但是这个'express()'是什么?它是方法还是构造函
我在尝试安装时收到以下错误 express : npm ERR! code ERR_OSSL_PEM_NO_START_LINE npm ERR! errno ERR_OSSL_PEM_NO_STAR
如 express 所述routing guide和 this answer ,我们可以创建“迷你应用程序”并从主应用程序使用它。但是我看到一段代码,它在模块中使用 app 而不是 router ap
我正在写一个 NestJS应用。现在我想安装 Express中间件 express-openapi-validator . 但是,我无法让它工作。有一个 description for how to
我看过很多类似的帖子,似乎我声明的 var1 似乎需要在其他地方传递,但我似乎无法弄清楚。 public Expression> CreateEqualNameExpression(string ma
Express(或 Connect 的)bodyParser 中间件被标记为已弃用,建议用户改用: app.use(connect.urlencoded()) app.use(connect.json
我只是想知道这种看似尴尬的配置的原因是什么(来自 Getting Started w/ Apollo Server ), const server = new ApolloServer({ //
我正在尝试在表单组中写入表单控件特定的验证错误消息。我在网上找到了几个教程和示例 ( such as this one ),概述了一个看似简单的 *ngIf div,如果在控件上检测到错误,则显示错误
我有一个简单的 Express 应用程序,托管在 AWS 上,使用无服务器框架。 我正在使用 serverless-http 包装 express 应用程序以部署到 AWS lambda 函数,并使用
我最近在 mozilla 教程的帮助下安装了 node 和 express。我正在安装应用程序生成器的下一步,但是当我运行时 npm install express-generator -g 在我的终
我遇到过两种不同的方式来定义 express、use() 中间件,我想知道它们之间是否有任何区别,或者它是否只是语法糖? 一个 const app = express(); app.use(cors(
我试图让我的 Jade 模板编写一个相对于当前 URL 的超链接 ( )。 例如,我的 View 是从 http://localhost/cats 调用的它看起来像这样: extends layou
检查 Express 文档我在下面看到了这种解决方案: app.all('/*', function(req, res) { console.log('Intercepting request
我似乎无法弄清楚如何包含多个模型。 我有三个模型。Tabs, Servers, and PointsTabs hasMany ServerServers belongsTo Tabs and hasM
我已使用Web PI安装IIS Express。在托盘中,没有IIS Express图标。如何在不使用命令行的情况下启动IIS Express?我希望IIS永久运行,因此没有命令行。 最佳答案 参见R
我不想在我的网站上使用 Jade 或 EJS。如何在不默认使用 Jade 模板的情况下创建快速站点?谢谢 最佳答案 如果您想要的是直接为静态 html 文件提供缓存资源的可能性,同时仍然能够点击“/”
Express是否支持HTTP动词“PATCH”,例如: app.patch("/api/resource", function(req, res){ ... }); 我检查了文档,对我来说似乎还不清
我正在快速服务器中运行 vue SPA。问题是当使用历史模式并刷新页面时,我得到一个 404 not found 异常。我尝试使用 connect-history-api-fallback 但不起作用
我是一名优秀的程序员,十分优秀!