【问题标题】:Checking if user has changed cookie value, manually手动检查用户是否更改了 cookie 值
【发布时间】:2011-10-14 06:55:10
【问题描述】:

我正忙于我的项目的登录系​​统。

只是为了增加安全性。如何检查/检测用户是否手动更改了 cookie 值?

有没有一些简单的方法可以做到这一点?还是我必须设置一个额外的 Session 变量并与之匹配?话虽如此,浏览器是否可以跟踪正常的 ASP.Net 会话?并且对用户可见?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    您可以在 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

    【讨论】:

    • 谢谢比尔,我一定会用这个。
    • 如果有人从您的 PC 上复制了 cookie 并在以后使用它会怎样?如何防止这种情况
    • 这段代码是用于签名的,我们检查篡改的另一部分在哪里?
    【解决方案2】:

    如果您必须处理此类敏感信息,我建议您不要将其存储在用户 cookie 中。而是使用sessions 来存储这些值,因为用户将无法篡改这些值。

    【讨论】:

      【解决方案3】:

      为什么不加密 cookie 值。这样,用户就很难真正正确地更改它。就像前面的答案提到的那样,如果它真的很敏感,cookie 不是存储它的地方,但加密可以为您提供更多保护。

      【讨论】:

      • 加密是不够的——你可以改变值,但它不会被检测到(虽然解密可能会失败,当然用户正在盲目更改)——你还必须签署cookie,正如比尔布拉斯基所建议的那样。
      • 真的兄弟,我认为这个答案不值得一票。检查这个答案,这是一个选项。这取决于你的意图是什么。可能加密会为他的目的而工作。 stackoverflow.com/questions/523629/…
      【解决方案4】:

      向您的 cookie 添加第二个变量,该变量对第一个值是唯一的。

      在Page_Load 上将两个值与数据库进行比较。

      如果它们不匹配记录,则删除 cookie。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 2012-03-10
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多