31

所以基本上我想知道我使用 Session 变量的方式有多安全。

我有一个登录表单,用户输入他的用户名/密码,它被参数化然后查询,如果用户名/密码存在,则从 db 表返回一个用户 ID。这对每个用户来说都是独一无二的。

当我有这个值时,这就是我想知道这种方式是否是在会话变量 uID 中存储用户 ID 的安全方式?不管怎样,我就是这样做的,

Session["uID"] = (int)dt.DefaultView[0]["userID"];

FormsAuthentication.RedirectFromLoginPage(username.Text, false);

Response.Redirect("userPage.aspx", false);

然后页面被重定向到另一个页面,我使用会话变量从数据库中获取用户表。

提前感谢您的反馈

4

5 回答 5

50

会话状态完全保存在服务器端,无论您使用哪种存储方法(内存中、会话状态服务器或数据库)。

因此,除非您的服务器被黑客入侵,否则会话变量是安全的。如果您的服务器确实被黑客入侵,黑客只能访问他自己会话中的数据,除非他找到一种方法来分析 IIS 进程的内存。

于 2012-11-19T10:10:31.390 回答
22

非常安全,.NET 会话变量与可以从客户端查看的 cookie 变量不同,此实例中的会话变量只能从 C# 代码访问。

因此,您可以放心,除了运行后台的代码之外,任何人/事物都不能编辑 Session 变量。

与您的问题不完全相关,但在您的情况下可能很高兴知道:

您还可以将整个对象存储在会话中,因此您可以将用户对象存储在会话中,例如

user_Class user = new user_Class();
user.UID = 1;
Session["User"] = user;

然后在加载每个页面时将其重新加载。

user_Class user = (user_Class)Session["User"];

然后您每次都可以从会话中获取 user.UID。

于 2012-11-19T10:10:11.423 回答
3

一切都好,直到您的网站超出单个服务器。然后,您必须将会话提供程序迁移到状态服务器或使用 sql server将其备份,这最终会有点糟糕。

有关会话安全问题的完整列表,请参阅http://msdn.microsoft.com/en-us/library/ms178201%28v=vs.80%29.aspx

于 2012-11-19T10:14:58.167 回答
3

当谈到会话时,您可以放心,数据不可直接访问。如果由于某种原因,您的应用程序曾经直接从会话中返回可能被利用的数据,但很少有任何理由这样做,因此风险相当小。

会话中最危险的部分是会话劫持。看,即使您的所有数据都安全地存储在服务器上,我们仍然需要处理整个“HTTP 是无状态的”问题。因此必须在客户端上存储某种标识符,以便服务器可以查找正确的会话数据。但是,如果另一个系统以某种方式获得了该 ID,那么只要服务器保持会话处于活动状态,他们就可以假装是您。

除了不断解决您网站中的任何跨站点脚本潜力之外,如果没有安全连接,您将无能为力。即使这样,它也可能被不当实施。

于 2012-11-19T10:41:21.677 回答
0

即使您的服务器没有受到损害,您仍然很容易受到攻击, 会话可以通过使用MITM 攻击轻松劫持,并且当攻击者获取您的会话时,他可以做任何您能做的事情。

您可以使用技术来避免会话劫持,但请记住,如果存在编码问题等导致您的应用程序易受攻击,您仍然容易受到攻击。

使用 SSL

SSL您的网站

在此处输入图像描述

生成哈希

保护会话

于 2017-10-21T07:09:51.923 回答