我正在慢慢地将我的(未发布的)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个字符的字符串。
%hash_password%
。
我必须知道$_COOKIE
的键(显然),然后我将字符串拆分为“|”并查看用户名和密码。如果某些东西不匹配,我会销毁这些饼干。
我的问题是:您是否有任何其他有关以安全格式存储Cookie的提示,或者这是好的?
我还为每个请求的操作生成一个nonce。例如,我为'删除'创建一个nonce,我希望在我的$_REQUEST
中获得该nonce。如果我的回复不正确,我不会将用户注销,但我什么都不做。
正如梅加尔所指出的,我知道COOKIES本质上是不安全的,我仍然会尽力使其变得安全。
答案 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上使用)
提供退出按钮。
让服务器自动在每个外部链接后发送一个新问题。
将客户端脚本整理为一行神秘的混搭,以隐藏答案算法。
不要忘记其他一系列风险和财产。