安全Cookies?

时间:2010-10-25 02:08:21

标签: php cookies

我正在慢慢地将我的(未发布的)CMS从$_SESSION移动到$_COOKIE。互联网上的内容似乎更偏向于$_SESSION(我假设因为易用性)。我正在寻找有关保存cookie的安全提示。目前,我正在以(以下格式)存储(有点类似的WordPress)cookie:

'logged_in_%hash_key%' => "username | %hash_password%"

我的%hash_key% md5(MYSALT."something".UNIQUE_KEY)UNIQUE_KEY在每次登录后重新生成(如果用户选择),以锁定可能存储Cookie的其他计算机。它是一个随机的6个字符的字符串。

使用Salt和随机密钥(散列)类似地生成

%hash_password%

我必须知道$_COOKIE的键(显然),然后我将字符串拆分为“|”并查看用户名和密码。如果某些东西不匹配,我会销毁这些饼干。

我的问题是:您是否有任何其他有关以安全格式存储Cookie的提示,或者这是好的

我还为每个请求的操作生成一个nonce。例如,我为'删除'创建一个nonce,我希望在我的$_REQUEST中获得该nonce。如果我的回复不正确,我不会将用户注销,但我什么都不做。

正如梅加尔所指出的,我知道COOKIES本质上是不安全的,我仍然会尽力使其变得安全。

4 个答案:

答案 0 :(得分:5)

我从您的一条评论中看到您希望使用“记住我”进行登录。一个简单的解决方案就是增加$ _SESSION的到期时间(或实现自己的会话算法)。但是,这通常被认为是不利的。这是一篇关于如何创建安全记忆的好文章:

http://jaspan.com/improved_persistent_login_cookie_best_practice

基本理念是:

饼干:

  • 用户名/电子邮件/等
  • 令牌
  • 系列

每次用户加载页面时都会更改令牌。但是,该系列在整个记忆期间保持不变。您可以在数据库(可能是MySQL)中保留系列和令牌的表格。

我不太擅长解释它,所以我强烈建议你阅读这篇文章。

答案 1 :(得分:3)

“安全cookie”是一种矛盾。坚持服务器端会话,这正是他们所适合的。你把它们放在首位的原因是什么?

答案 2 :(得分:0)

我全都使用$ _COOKIE而不是$ _SESSION,因为我相信它在数据隐私方面更专业。 授权是一个不合适的用例。继续使用$_SESSION

通过几个简单的步骤就可以避免会话固定问题。最重要的是确保session_start()不会盲目接受会话ID。确保服务器通过为其提供默认令牌来创建会话:

if (empty($_SESSION["ok"])) {   // would be empty for injected ids
    session_regenerate_id();
    $_SESSION['ok'] = 1;
}

作为第二项措施,使用指纹。最好存储原始请求IP。但只能验证,例如解决代理问题的前16位。通常HTTP_USER_AGENT用作指纹。此外,您还应为每个会话提供预定义的到期时间。

答案 3 :(得分:0)

如果服务器和客户端之间的通信是真正的通信,那么黑客就很难。服务器向客户端发送问题 - 假设他发送了一个已知的HTML ID。客户端回答该元素的name属性的内容。当然,服务器必须能够验证答案。 有创意

只要客户端在线,您就不再需要cookie,还有其他方法。但是如果他离开,脚本可以在卸载之前向服务器发送ajax请求以获取新的cookie /问题。 (onbeforeunload现在也可以在safari上使用)

提供退出按钮。

让服务器自动在每个外部链接后发送一个新问题。

将客户端脚本整理为一行神秘的混搭,以隐藏答案算法。

不要忘记其他一系列风险和财产。