使用会话变量管理用户会话数据的优缺点是什么?

时间:2014-05-29 10:29:01

标签: asp.net session variables caching viewstate

使用 ASP.NET 我一直使用会话变量来维护用户会话数据。

通常:(编码为简单的bools / ints,总变量约为12个)

  • 用户信息。
  • 页面安全权限。

我已经阅读了有关使用会话变量的负面影响的越来越多的信息。 我知道会话变量存储在内存中,使用太多的负面影响可以存在;这不是这个问题的理想范围。


我想知道的事情:

使用当前开发语言和功能:

  • 会话变量会带来安全风险吗? (安全风险我的意思是可以读取/更改变量)

  • 使用查询字符串 viewstate 缓存数据库请求是否有更好的效果每页加载?

  • 什么是“考虑”处理用户会话数据的良好做法。 (与此主题相关的所有主题现在都很陈旧,可能不再相关)?

4 个答案:

答案 0 :(得分:3)

表演总是主观的,可能会因不同的事情而有所不同。在你的情况下,你试图比较无比,因为

  • 查询字符串不能用于共享敏感用户信息或页面安全性,因为每个人都可以直接在浏览器中修改网址
  • viewstate在页面级别设置和维护。它不能跨越不同的页面请求,仅在当前页面的回发中传送。
  • 缓存在应用程序级别完成,所有用户都可以访问它。它可能适用于页面安全权限但不适用于存储单个用户信息。

发出数据库请求是唯一可比较的选项,是的,它比会话慢。您可以尝试使用viewstate和缓存,尝试提高性能并减少数据库工作负载。

会话存储在服务器的内存中,但依赖于cookie,理论上,可以通过窃取asp.net会话cookie来劫持会话。

  

SessionID值以明文形式发送。恶意用户可以得到   通过获取SessionID值来访问另一个用户的会话   并将其包含在对服务器的请求中。如果你要存储   会话状态下的敏感信息,建议您使用   SSL加密浏览器和服务器之间的任何通信   包括SessionID值。

引用:http://msdn.microsoft.com/en-us/library/ms178581.aspx

结论:使用会话是安全的,但要使其更安全,请使用HTTPS

ASP.NET为用户身份验证,基于角色的授权和用户配置文件提供了开箱即用的功能,这些功能可能有意义。详细了解个人资料:How to use Profile in ASP.NET?Regarding Profile and session in asp.net此网站上有很多关于身份验证和授权的其他主题和答案。

答案 1 :(得分:1)

  

会话变量会带来安全风险吗? (根据安全风险,我的意思是可以读取/更改变量)

虽然正如smirnov所引用的,恶意用户可能会通过劫持会话本身来获取另一个用户的会话,但会话变量本身存储在服务器端,并且无法直接访问。 / p>

  

使用查询字符串,视图状态,缓存或者是否有更好的性能   在每个页面加载时发出数据库请求?

斯皮尔诺夫写道,这种比较并不完全有效。但是,请考虑:

  • querystrings和viewstate 存储在http请求中,因此安全性较低且不占用内存。但是,它们需要一些较小的处理能力来解析。
  • 缓存(在Web服务器RAM中)先前数据库请求的结果将减轻数据库的负载以及Web服务器和数据库服务器之间的网络连接,并且还将更快地检索数据。但是,他们显然会在Web服务器本身使用更多RAM。
  

处理用户会话数据的“做法”是什么好方法。   (与此主题相关的所有主题现在都非常陈旧,也许没有   更长的相关)?   由于原则没有太大变化,现有的资料来源,恕我直言应该仍然具有相关性。

注意:如果您使用多台服务器,则需要通过使用状态服务器来同步会话数据,或者使用“粘性会话”,其中每个会话始终由同一台服务器。

答案 2 :(得分:1)

在我看来,你应该尽可能避免会话。以下是我的理由,没有特别的顺序。

  • 当您添加更多节点时,会话不会自动扩展(当然您可以使用专用的会话服务器,但会带来一些开销)

  • 启用会话后,每个用户只能同时发出一个请求。如果启用会话以避免任何竞争条件,Asp.net将实现每用户锁定。如果您使用大量的ajax,这主要是一个问题。

  • 如果必须重新启动网络服务器,则用户将失去会话。这对我来说真的是重点。有一个系统,人们冒着被赶出去的风险,得到一个损坏的会话或者只是因为你需要部署一个错误修复而失去进展,这真的很糟糕。尽可能避免会话为您的用户提供更多自由和更好的体验。

这取决于你,但我总是试图将数据存储在持久存储中,或者使用Web中实际存在的东西(cookie,查询字符串,将状态写入隐藏字段等)。我打赌有些情况下我会使用会话,但我的默认选择是避免它们。

答案 3 :(得分:1)

这几天有更多选择:

  • 本地存储/会话存储/页面Javascript变量-适用于客户端存储情况。参见https://www.w3schools.com/html/html5_webstorage.asp。但是,如果没有服务器端签名,它们将不适合大多数信任情况。重新启动页面后,一个javascript变量将丢失,但如果写入该变量,则该变量将保留在浏览器的会话存储中。如果该浏览器选项卡关闭,则会话存储将丢失,但如果写入本地存储,则该会话存储将保留在本地存储中。
  • JSON Web令牌(JWT)-是用于替换会话的新兴新标准。这是用于身份验证,角色,数据和声明的标准,由服务器签名,也可以加密,以使客户端无法读取任何详细信息。这通常由客户端存储在本地存储中,并且仅对可以写入Bearer标头的“单页应用程序”真正起作用。不要将其用于服务器端生成HTML的MVC(MVC.Controller)。 JWT很难设置和自定义-OWIN的API非常稀疏。 JWT也可能变大,这意味着您总是在每次向Web服务器请求时“上传” JWT数据。但是,JWT使您的安全性可以由一台服务器(甚至是外部信任的服务器)处理。
  • ASP.Net服务器端会话-可以是内存中的进程内,内存中的外部进程和数据库。

回答您的特定问题:

  1. 安全风险-并非如此。会话使用的密钥足够长,无法猜测。这些天通常使用HTTPS,以便安全地传输值。变量仅存储在服务器上,每个用户一组。如果用户的设备遭到破坏,则可以窃取会话密钥,但是,如果他们的设备遭到破坏,则存在更大的问题要解决。

  2. 与In-Proc(内存)会话相比,“查询字符串”,“视图状态”或“缓存”的性能并没有好坏。它们全都在内存速度(RAM)的范围内-纳秒。数据库(存储的磁盘)肯定较慢,因为介质访问时间较慢-毫秒

  3. 会话是一种好习惯。有些人建议使用专用类来读取和存储每个变量(使用“属性”),这样就不会混淆会话变量名(字符串)。

我喜欢Sessions可能采用的混合方法。参见How can I store Session information in a hybrid (Database + Memory) way?