什么是会话ID和如何使用会话ID

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是会话ID和如何使用会话ID相关的知识,希望对你有一定的参考价值。

参考技术A 什么是会话ID

会话ID是一种唯一标识当前访问服务器的客户的只读值。在经典的ASP环境下,会话ID是按照顺序方式被分配的,也就是说,会话ID 706616433之后跟着会话 ID 706616434等等。传统的ASP会话ID以加密的、非持久存在的cookie形式保存在客户机上。例如,会话ID 706616434就可能作为cookie ASPSESSIONIDGQQGQGCS=JHMBOBKCBINEHLPKJHOPABBE保存在客户机上。

ASP.NET下的会话ID有所变化。在使用 ASP.NET 时,会话ID是由URL合法ASCII字符组成的一个120位字符串。根据微软文档的说明,产生会话 ID 值采用了保证其唯一性的算法,从而避免出现两个客户试图采用同一ID时出现的会话冲突。另外,会话ID的随机性使得确定现有会话的ID变得非常困难从而带来了额外的安全性。同传统ASP一样,ASP.NET的会话ID通常也作为非持久保存的cookie存储在客户机上。这种cookie的格式同传统ASP相比稍有变化,例如,asp.net_sessionid=jhmbobkcbinehlpkjhopabbe。

除了维持状态的传统型的、非持久保存的cookie的方法之外,ASP.NET还支持一种不采用cookie的会话状态维持模式。在启用无cookie模式的情况下,ASP.NET在发送回客户机的URL中嵌入会话ID。这样就为使用不支持cookie或禁用cookie浏览器的客户提供了会话状态坚持。考虑到利用cookie跟踪客户信息的举动,我们有理由对无Cookie模式保持高度的关注。

如何使用会话ID

客户每发出一个请求,包含加密会话ID的cookie在存在的情况下即被发送给服务器。服务器随后确定cookie所关联的会话ID并恢复关联该客户的所有会话变量。如果cookie不存在就会生成一个新的会话ID,同时加密的会话ID cookie则被发送给客户机。这样就能让ASP跟踪访问网站的单个客户了。同时,以上机制还促使ASP建立服务器方会话变量同单一会话的关联关系。

已经实施 csrf 保护时使用会话 id 的目的是啥?

【中文标题】已经实施 csrf 保护时使用会话 id 的目的是啥?【英文标题】:What is the purpose of using a session id when csrf protection is already implemented?已经实施 csrf 保护时使用会话 id 的目的是什么? 【发布时间】:2015-01-15 12:02:58 【问题描述】:

我知道要保护 Web 应用程序免受跨站请求伪造,唯一安全的方法是实现 CSRF 令牌。我的问题是,是否也可以使用 CSRF 令牌来跟踪会话?为什么我们要实现不同的会话 ID 来跟踪会话?

【问题讨论】:

【参考方案1】:

CSRF 令牌是一个必须随机生成并与 EVERY GET 中的会话(用户)相关联的值,它显示了防止错误 POST 的表单。这个错误的 POST 也来自用户浏览器,因此,要对 POST 进行身份验证,您需要与存储在服务器内存中的令牌进行会话,以比较 POST 附带的令牌是否与用户会话中存储的相同。

此外,Web 应用程序需要在 GET 中识别用户,而 CSRF 令牌仅在 POST 中。

由于 HTTP 的断开连接性质,会话需要是静态的,以便随着时间和多个请求识别用户。 CSRF 在每次 GET 中都会发生变化,它不能像 session 一样使用。

另一方面。你的想法应该用什么服务器?每次 GET 创建一个新会话并将所有以前的会话数据复制到新会话?这太疯狂了。

看看蒙大拿州立大学的this pdf。它有助于我理解 CSRF。

【讨论】:

"CSRF 令牌仅在 POST 中" 错误!我认为您对 csrf 令牌的整个想法是错误的。 简短回答:会话需要是静态的,才能随着时间的推移识别用户。 CSRF 在每个 GET 中都会发生变化,所以如果您重复 CSRF 令牌以像会话一样使用它们,那么您做错了。 据我了解,CSRF 令牌可以通过 url 或 POST 正文内容发送。为了安全起见,我们使用 POST。但这不是问题。我们不能简单地使用 CSRF 令牌作为会话标识符吗?即使它们是随机字符,服务器仍然知道它在特定会话仪式中对用户的价值吗?这些信息不能用于会话识别吗? @jlvaquero 您可以在 cookie 中发送 CSRF 令牌以使用 ajax get。不仅在 POST 中使用 CSRF 有很多方法 @Anonymous Platypus 但如果您每次生成新的 CSRF 令牌时都将会话信息存储在服务器端(RAM 内存、redis 等),那么您就是在创建一个新的会话 ID。因此,您必须将所有这些信息移至新会话。由于您在 Web 应用程序生命周期中生成了大量 CSRF 令牌,因此这不是一个好主意。

以上是关于什么是会话ID和如何使用会话ID的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有会话的 insert_id() 插入其他表?

如何获取 tokbox 存档会话的存档 ID?

使用 MSTSCLib 时如何查找远程桌面会话 ID

如果我知道 Apache Shiro 中的会话 ID 而不使用任何哈希映射,如何验证会话 ID?

dialogflow - 如何获取会话 ID?

登录asp.net后如何更改会话ID