C# 会话ID不够随机-ASP.NET

C# 会话ID不够随机-ASP.NET,c#,asp.net,sessionid,asp.net-session,C#,Asp.net,Sessionid,Asp.net Session,更新 我们最终与Acunetix团队中的一些程序员举行了一次会议,他们意识到他们的代码中可能存在一些错误,导致扫描中显示的问题比实际情况更严重。一般的共识是忽略扫描结果,使用现成的ASP.NET会话ID生成,因为它对我们的站点应该足够安全 @Vasile Bujac因为您的答案是唯一的,并且提到使用ASP.NET标准解决方案,所以我将此作为答案,但感谢大家的帮助 我们在工作中使用Acunetix的视网膜扫描仪对我们的应用程序进行安全扫描。它告诉我们,我们的会话ID不够随机,也不太可预测。我不确

更新

我们最终与Acunetix团队中的一些程序员举行了一次会议,他们意识到他们的代码中可能存在一些错误,导致扫描中显示的问题比实际情况更严重。一般的共识是忽略扫描结果,使用现成的ASP.NET会话ID生成,因为它对我们的站点应该足够安全

@Vasile Bujac因为您的答案是唯一的,并且提到使用ASP.NET标准解决方案,所以我将此作为答案,但感谢大家的帮助


我们在工作中使用Acunetix的视网膜扫描仪对我们的应用程序进行安全扫描。它告诉我们,我们的会话ID不够随机,也不太可预测。我不确定ASP.NET默认情况下是如何生成会话ID的(我还以为它是GUID?),但我继续实现了扩展SessiondManager类并重写CreateSessionID和Validate方法以使用GUID的方法,如中所述

虽然这使得它稍微有点随机性,但根据Acunetix的说法,它仍然没有产生“期望的”效果。我甚至在web.config中添加了
regenerateExpiredSessionId=“true”
属性,但没有任何效果。我有一种感觉,我可能需要故意调用
会话。放弃()
,以真正清除会话并获取新ID。问题是,我必须在用户登录之前调用它,因为这是知道用户正在启动新会话的唯一防故障方法。因此,我无法在会话中设置任何内容,直到下一个页面加载了
放弃
方法的工作方式,这意味着中间的页面不是很理想,但会起作用

是否有人经历过这种情况或成功实施了修复

另外,仅供参考,我们不使用成员身份/表单身份验证,我们只是在有人登录时创建一个新的自定义用户类,并将其保存在会话中以供以后使用


来自Acunetix的报告:

说明:表现出低熵(“随机性”)的会话令牌通常容易受到预测攻击。不安全的令牌可能是由于伪随机数生成器、基于时间的值、静态值或基于用户属性(用户名或用户ID)的值不足造成的。这意味着攻击者可以在短时间内监视应用程序并收集其创建的会话令牌后猜测有效的会话令牌。如果攻击者确定另一个用户的有效会话令牌,则可以查看、修改或删除任意用户的数据,而无需猜测受害者的用户名或密码。因此,推断有效会话令牌的能力使攻击者能够绕过登录页面,避免对帐户进行暴力攻击。此外,即使受害者当前未登录到应用程序,静态令牌也可以使攻击者以用户为目标。这会增加攻击者可以瞄准的受害者池

会话令牌应使用强随机数生成器创建,并从大量数字中收集。例如,如果操作系统的rand()函数可以生成统计上均匀分布的32位值,那么它通常就足够了。糟糕的会话令牌是增量的,依赖于用户的帐户ID,只使用时间戳,或者具有其他高度确定性的信息。保护会话令牌安全性的其他方法是始终通过SSL传输它们,在特定时间段后自动使令牌过期,并在用户注销应用程序时显式使令牌过期

建议:如果会话值表现出很强的随机性,但是是从一个小的值池中选择的,那么攻击者更容易猜测有效令牌。web应用程序的会话管理可以通过实施几种补充技术来改进:

  • 确保令牌值的大小至少为32位,特别是对于具有大量并发用户和大量每日页面请求的应用程序
  • 熵源的位大小(随机值)比实际会话令牌的位大小更重要。例如,MD5哈希生成128位的值。然而,增量值、时间戳或8位随机数的MD5散列都是不安全的,因为可以容易地预测随机值的来源。因此,128位大小并不表示会话令牌的准确度量。熵源的最小大小为32位,但对于每小时并发用户数超过10000的站点,可能需要更大的池(48或64位)
  • 在大多数情况下,应用程序生成的令牌(例如ASP.NET_SessionId、ASPSESSIONID、JSPSESSIONID、PHPSESSIONID)提供足够大的随机值以防止会话预测攻击。应用程序应该使用这些会话管理算法,除非自定义会话机制已经过彻底的审查和测试
  • 使用服务器端对象跟踪与会话令牌关联的用户属性,以防止用户模拟攻击。如果应用程序没有将用户的会话令牌与该用户的配置文件信息严格关联,则攻击者可以通过操纵客户端值查看任意信息。例如,如果应用程序设置了强会话令牌,但基于“UserId”cookie执行SQL查询,则攻击者只需修改“UserId”cookie以模拟其他人。如果应用程序将“UserId”值与服务器端会话对象相关联,则会更加安全,因为攻击者将无法修改该值
  • 当用户注销应用程序或afte时,使会话令牌过期
    byte[] random = new byte[100];
    //RNGCryptoServiceProvider is an implementation of a random number generator.
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    rng.GetBytes(random); // The array is now filled with cryptographically strong random bytes.
    return Convert.ToBase64String(random)