【发布时间】:2011-10-14 06:55:10
【问题描述】:
我正忙于我的项目的登录系统。
只是为了增加安全性。如何检查/检测用户是否手动更改了 cookie 值?
有没有一些简单的方法可以做到这一点?还是我必须设置一个额外的 Session 变量并与之匹配?话虽如此,浏览器是否可以跟踪正常的 ASP.Net 会话?并且对用户可见?
谢谢。
【问题讨论】:
标签: c# asp.net cookies session-cookies
我正忙于我的项目的登录系统。
只是为了增加安全性。如何检查/检测用户是否手动更改了 cookie 值?
有没有一些简单的方法可以做到这一点?还是我必须设置一个额外的 Session 变量并与之匹配?话虽如此,浏览器是否可以跟踪正常的 ASP.Net 会话?并且对用户可见?
谢谢。
【问题讨论】:
标签: c# asp.net cookies session-cookies
您可以在 cookie 值上附加一个数字签名,并在读回该签名时检查该签名。这样,如果cookie值被篡改,就会非常明显。
private string sign(string hashStr, byte[] secret)
{
// Compute the signature hash
HMACSHA1 mac = new HMACSHA1(secret);
byte[] hashBytes = Encoding.UTF8.GetBytes(hashStr);
mac.TransformFinalBlock(hashBytes, 0, hashBytes.Length);
byte[] hashData = mac.Hash;
// Encode the hash in Base64.
string hashOut = Convert.ToBase64String(hashData);
return hashOut;
}
编辑:修复了编码器,使其明确为 UTF-8。
像往常一样,你还应该确保在调用它之前给你的字符串添加一些盐,见:Secure hash and salt for PHP passwords
【讨论】:
如果您必须处理此类敏感信息,我建议您不要将其存储在用户 cookie 中。而是使用sessions 来存储这些值,因为用户将无法篡改这些值。
【讨论】:
为什么不加密 cookie 值。这样,用户就很难真正正确地更改它。就像前面的答案提到的那样,如果它真的很敏感,cookie 不是存储它的地方,但加密可以为您提供更多保护。
【讨论】:
向您的 cookie 添加第二个变量,该变量对第一个值是唯一的。
在Page_Load 上将两个值与数据库进行比较。
如果它们不匹配记录,则删除 cookie。
【讨论】: