使用 ASP.NET 我一直使用会话变量来维护用户会话数据。
通常:(编码为简单的bools / ints,总变量约为12个)
我已经阅读了有关使用会话变量的负面影响的越来越多的信息。 我知道会话变量存储在内存中,使用太多的负面影响可以存在;这不是这个问题的理想范围。
我想知道的事情:
使用当前开发语言和功能:
会话变量会带来安全风险吗? (安全风险我的意思是可以读取/更改变量)
使用查询字符串, viewstate ,缓存或数据库请求是否有更好的效果每页加载?
什么是“考虑”处理用户会话数据的良好做法。 (与此主题相关的所有主题现在都很陈旧,可能不再相关)?
答案 0 :(得分:3)
表演总是主观的,可能会因不同的事情而有所不同。在你的情况下,你试图比较无比,因为
发出数据库请求是唯一可比较的选项,是的,它比会话慢。您可以尝试使用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>
使用查询字符串,视图状态,缓存或者是否有更好的性能 在每个页面加载时发出数据库请求?
斯皮尔诺夫写道,这种比较并不完全有效。但是,请考虑:
处理用户会话数据的“做法”是什么好方法。 (与此主题相关的所有主题现在都非常陈旧,也许没有 更长的相关)? 由于原则没有太大变化,现有的资料来源,恕我直言应该仍然具有相关性。
注意:如果您使用多台服务器,则需要通过使用状态服务器来同步会话数据,或者使用“粘性会话”,其中每个会话始终由同一台服务器。
答案 2 :(得分:1)
在我看来,你应该尽可能避免会话。以下是我的理由,没有特别的顺序。
当您添加更多节点时,会话不会自动扩展(当然您可以使用专用的会话服务器,但会带来一些开销)
启用会话后,每个用户只能同时发出一个请求。如果启用会话以避免任何竞争条件,Asp.net将实现每用户锁定。如果您使用大量的ajax,这主要是一个问题。
如果必须重新启动网络服务器,则用户将失去会话。这对我来说真的是重点。有一个系统,人们冒着被赶出去的风险,得到一个损坏的会话或者只是因为你需要部署一个错误修复而失去进展,这真的很糟糕。尽可能避免会话为您的用户提供更多自由和更好的体验。
这取决于你,但我总是试图将数据存储在持久存储中,或者使用Web中实际存在的东西(cookie,查询字符串,将状态写入隐藏字段等)。我打赌有些情况下我会使用会话,但我的默认选择是避免它们。
答案 3 :(得分:1)
这几天有更多选择:
回答您的特定问题:
安全风险-并非如此。会话使用的密钥足够长,无法猜测。这些天通常使用HTTPS,以便安全地传输值。变量仅存储在服务器上,每个用户一组。如果用户的设备遭到破坏,则可以窃取会话密钥,但是,如果他们的设备遭到破坏,则存在更大的问题要解决。
与In-Proc(内存)会话相比,“查询字符串”,“视图状态”或“缓存”的性能并没有好坏。它们全都在内存速度(RAM)的范围内-纳秒。数据库(存储的磁盘)肯定较慢,因为介质访问时间较慢-毫秒
会话是一种好习惯。有些人建议使用专用类来读取和存储每个变量(使用“属性”),这样就不会混淆会话变量名(字符串)。
我喜欢Sessions可能采用的混合方法。参见How can I store Session information in a hybrid (Database + Memory) way?