会话ID不够随机 - ASP.NET

时间:2011-08-01 18:17:34

标签: c# asp.net sessionid asp.net-session

1 个答案:

答案 0 :(得分:9)

我记得,ASP.NET会话ID生成器可以很好地防止会话预测。会话id使用[a-z]字符和[0-5]数字(总共32个可能的字符,即2 ^ 5)有24个字符,这给出总共2 ^(5 * 24)= 2 ^ 120个可能的值。但是,您可以实现SessionIDManager以附加一些信息(如用户主机地址,用户代理,使用HMAC算法的验证令牌)以获得更好的保护 - 这样来自不同IP地址或不同浏览器的会话ID将无法通过验证。如果您实现了表单身份验证,则不需要这样做,因为身份验证票证已经提供了这些类型的保护。

如果你想要一个更好的随机会话id你可以在SessionIDManager中使用RandomNumberGenerator,例如RNGCryptoServiceProvider,并填充一堆字节(比如32位,即256位),然后用Base64对它们进行编码

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) 

但是,this article表示会话ID的最大长度为80,因此您必须覆盖Validate方法才能使其正常工作。

相关问题