代码之家  ›  专栏  ›  技术社区  ›  Markandey Singh

如何创建一个不被用户/客户篡改的、防盗的cookie?

  •  4
  • Markandey Singh  · 技术社区  · 15 年前

    防盗意味着我可以检测到这是来自不同的客户机IP或通过不同的路由(比如当客户机位于代理服务器之后或其他什么时候)。

    防篡改意味着我可以检测到cookie无效并且不是由服务器发送的。

    3 回复  |  直到 14 年前
        1
  •  5
  •   rook    14 年前

    一块饼干 必须始终 是一个 Cryptographically secure pseudo random number (CSPRNG) 这也是一个 Cryptographic Nonce 或仅使用一次的值。此值用于访问服务器端的状态信息。

    为什么?不管攻击者是否修改了值,他仍然无法更改会话状态。

    加密cookie怎么样?在安全方面,最好一起避免这个问题。这是对密码术的滥用,因为它为最近的攻击打开了大门 ASP.NET Oracle CBC Padding attack .

    要添加的其他一些功能:

    “安全cookies”-很糟糕的名字,但它是一个标志,强制cookie始终通过https传输。这可以确保你不会违反 OWASP A9 .

    “httponly cookies”-这使得javascript无法访问 document.cookie 让饼干更难被劫持。

    一定要补好你的骑行时间。 CSRF .

    确保通过使用 Sitewatch Free Edition Wapiti . 即使使用HTTP,也只能使用cookies XSS绕过基于令牌和引用的CSRF保护。

        2
  •  -1
  •   babbitt    15 年前

    我不是这个领域的专家,但我觉得我可以为解决这个问题贡献思想。

    1. 生成固定长度的大随机(ISH)数。
    2. 用盐散列这个数字。
    3. 将salt散列附加到随机数的末尾(从1开始),并将其发送到客户机。
    4. 使用SSL。
    5. 要检查完整性,请拆分字段,将盐添加到第一部分,重新散列。如果哈希与第二个字段不匹配,则它已被篡改。

    正如我之前所说,我不是专家,但这似乎是可行的。

        3
  •  -1
  •   saille    15 年前

    要回答您的问题: 您无法检测您的cookie是否被盗或被复制。当它离开服务器后,你不知道它发生了什么-你怎么能?

    但是,您可以使用安全哈希算法检测发送的原始cookie数据是否被篡改,例如 SHA-1 .

    sha-1算法生成散列签名,如果应用散列签名的数据发生更改,则散列签名会发生更改(或在统计上很可能发生更改)。因为您不仅使用数据生成散列,而且还使用秘密 Salt , 只有你 无法为给定的数据块生成正确的哈希签名。如果有人修改了您的数据,他们将无法在没有salt值的情况下对哈希进行相应的更改。当然,您将检查返回的所有数据,以验证附带的哈希签名是否正确。这要求您将散列签名附加到数据的末尾,或者使用类似的机制将数据和散列签名保持在一起。

    记住,盐的价值需要保密。

    正如@rook所指出的,从安全的角度来看,最好不要将数据存储在cookie中,从而完全避免这个问题。但我们并非都在编写网上银行业务应用程序,哈希签名可能足以满足您的需要。

    您不妨看看以下网站提供的资源: OWSAP . OWASP有一系列 Top 10 最常见的Web应用程序安全漏洞的优先级列表。确保你熟悉这些,这样你就不会犯别人以前犯过的错误。