Security 在会话中存储身份验证数据如何在低级别工作?

Security 在会话中存储身份验证数据如何在低级别工作?,security,session,cookies,Security,Session,Cookies,无论使用何种语言和框架,这在低级别(将变量放入会话以验证用户身份)中是如何工作的 put_session(curr_connection, :current_user, user.id) 用户是否保存在cookie中?在客户身上?那么,是什么阻止浏览器用户通过存储他们想要的任何用户的id并代表该用户进行身份验证来更改它呢?或者user.id是否保存在服务器上,而在客户机上,我们只有一个looooong会话id,在cookie或url中?简单的回答是这取决于具体情况。所有语言/框架都有其默认值,

无论使用何种语言和框架,这在低级别(将变量放入会话以验证用户身份)中是如何工作的

put_session(curr_connection, :current_user, user.id)

用户是否保存在cookie中?在客户身上?那么,是什么阻止浏览器用户通过存储他们想要的任何用户的id并代表该用户进行身份验证来更改它呢?或者
user.id
是否保存在服务器上,而在客户机上,我们只有一个looooong会话id,在cookie或url中?

简单的回答是这取决于具体情况。所有语言/框架都有其默认值,例如Ruby on Rails默认将其存储在cookie中,PHP将其存储在服务器上,等等。但在几乎所有这些语言中,您都可以将cookie存储更改为您想要的任何内容

一些选项(可能还有更多):

  • Cookies-在这种情况下,cookie在发送到客户端之前进行加密。用于加密的密钥是某种应用程序设置。这在某种程度上是安全的,因为即使会话值存储在客户端上,用户仍然无法查看或修改它们,因为他没有应用程序密钥。这样做的优点是非常简单,并且需要零设置,缺点包括与其他解决方案相比安全性较低,而且可以存储在cookie中的数据量有限

  • 服务器内存-在这种情况下,会将加密随机会话id发送到客户端,所有会话数据都存储在应用程序服务器内存中,由会话id标识。其优点是不会写入磁盘,也不会发送到客户端。缺点包括应用服务器重新启动时会话数据丢失

  • 服务器文件系统-传统的方法(一种)是将会话数据存储在文件中,以便在应用程序服务器重新启动时将其持久化。在这种情况下,对这些文件的访问控制是关键,但通常由语言或框架负责

  • 服务器SQL数据库传统的重量级方法是,所有会话数据都存储在应用服务器或单独数据库服务器上的关系数据库中。其优点是,您可以直接控制任何用户的会话内容,而不仅仅是登录用户的会话内容(例如,通过从数据库中删除会话条目,可以很容易地强制管理员注销)。在应用程序级攻击的情况下,这同样也是一个缺点。而且手术费用更高

  • 服务器NoSQL数据库-与关系数据库大致相同,但也可以使用像Redis这样的非关系数据库。一个缺点是Redis中的访问控制至少可以说不是很强

  • 会话服务-在某些企业应用程序中,您可能希望实现某种会话服务(RESTful或其他)。显然,这只是将问题向后推了一层,会话数据仍然必须使用上述选项之一存储在某个地方


您的语言或环境可能已经支持其中一些,如果您想要一个现成的不受支持的语言或环境,您可以实现自己的语言或环境。然而,会话管理是一项棘手的业务,很容易使其变得脆弱。OWASP有一个很好的参考方法。

简单的回答是这取决于具体情况。所有语言/框架都有其默认值,例如Ruby on Rails默认将其存储在cookie中,PHP将其存储在服务器上,等等。但在几乎所有这些语言中,您都可以将cookie存储更改为您想要的任何内容

一些选项(可能还有更多):

  • Cookies-在这种情况下,cookie在发送到客户端之前进行加密。用于加密的密钥是某种应用程序设置。这在某种程度上是安全的,因为即使会话值存储在客户端上,用户仍然无法查看或修改它们,因为他没有应用程序密钥。这样做的优点是非常简单,并且需要零设置,缺点包括与其他解决方案相比安全性较低,而且可以存储在cookie中的数据量有限

  • 服务器内存-在这种情况下,会将加密随机会话id发送到客户端,所有会话数据都存储在应用程序服务器内存中,由会话id标识。其优点是不会写入磁盘,也不会发送到客户端。缺点包括应用服务器重新启动时会话数据丢失

  • 服务器文件系统-传统的方法(一种)是将会话数据存储在文件中,以便在应用程序服务器重新启动时将其持久化。在这种情况下,对这些文件的访问控制是关键,但通常由语言或框架负责

  • 服务器SQL数据库传统的重量级方法是,所有会话数据都存储在应用服务器或单独数据库服务器上的关系数据库中。其优点是,您可以直接控制任何用户的会话内容,而不仅仅是登录用户的会话内容(例如,通过从数据库中删除会话条目,可以很容易地强制管理员注销)。在应用程序级攻击的情况下,这同样也是一个缺点。而且手术费用更高

  • 服务器NoSQL数据库-与关系数据库大致相同,但也可以使用像Redis这样的非关系数据库。一个缺点是Redis中的访问控制至少可以说不是很强

  • 会话服务-在某些企业应用程序中,您可能希望实现某种会话服务(RESTful或其他)。显然,这只会推动公共关系