Php 安全饼干?

Php 安全饼干?,php,cookies,Php,Cookies,我正在慢慢地将我的(未发布的)CMS从$\u会话移动到$\u COOKIE。互联网上的内容似乎更倾向于$\u SESSION(我认为是因为易于使用)。我正在寻找保存cookies的安全提示。目前,我正在以以下格式存储一个cookie(有点类似于WordPress): 'logged_in_%hash_key%'=>“username |%hash_password%” 其中,我的%hash\u key%是md5(MYSALT.“something.”UNIQUE\u key)并且在每次登录后重新

我正在慢慢地将我的(未发布的)CMS从
$\u会话
移动到
$\u COOKIE
。互联网上的内容似乎更倾向于
$\u SESSION
(我认为是因为易于使用)。我正在寻找保存cookies的安全提示。目前,我正在以以下格式存储一个cookie(有点类似于WordPress):

'logged_in_%hash_key%'=>“username |%hash_password%”

其中,我的
%hash\u key%
md5(MYSALT.“something.”UNIQUE\u key)
并且在每次登录后重新生成
UNIQUE\u key
,以锁定可能存储了cookie的其他计算机。它是一个随机的6个字符的字符串

%hash\u password%
类似地使用Salt和随机密钥(散列)生成

我必须知道
$\u COOKIE的密钥(显然),然后我用“|”分割字符串并查看用户名和密码。如果有不匹配的地方,我会毁掉饼干

我的问题是:关于以安全格式存储cookie,您还有其他建议吗?或者这是否很好

我还为每个请求的操作生成一个nonce。例如,我为“delete”创建了一个nonce,我希望在我的
$\u请求中返回该nonce。如果收到错误的响应,我不会将用户注销,但我不会做任何事情


正如meagar所指出的,我知道Cookie本质上是不安全的,我仍在尽最大努力使其安全。

“安全Cookie”是一个矛盾修饰法。坚持使用服务器端会话,这正是它们适合的。首先,您离开它们的原因是什么?

我完全支持在$会话中使用$COOKIE,因为我相信它在数据隐私方面更专业但是授权是一个不合适的用例。继续使用
$\u会话

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

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

第二种方法是使用指纹。最好存储原始请求IP。但仅验证前16位,以解决代理问题。HTTP_用户_代理通常用作指纹。另外,您还应该为每个会话指定一个预定义的到期时间。

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

基本思想是:

曲奇饼:

  • 用户名/电子邮件/等
  • 代币
  • 系列
每次用户加载页面时都会更改令牌。但是,在“记住我”的整个过程中,该系列保持不变。您将在数据库(可能是MySQL)中保留一个系列表和令牌


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

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

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

提供一个注销按钮

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

将客户端脚本丑化为一行晦涩的混搭,以隐藏答案算法


别忘了还有其他的风险和财产

伙计,我真想这么做。但我正在努力创造更好的用户体验(不必定期登录)。@Jason你知道你的会话已经使用cookies了吗?你可以增加它们过期的时间吗?你可以改为创建更长的会话长度(时间),让用户登录更长的时间。我一直在阅读有关$\u会话注入的文章,但似乎没有人给出一个例子。“你知道这是怎么做到的,这样我就可以对付它了吗?”Jason通过破坏用来传递会话ID的cookies。将更多数据移动到客户端只会使情况变得更糟。了解更多信息。为什么Cookie应该有更好的隐私?任何在网吧里使用个人电脑的人都会将自己的数据撒在公共电脑上,而这些数据在网上是绝对安全的server@knittl:从技术角度看,你是对的。Cookies可以被发现,而会话存储是由服务器保护的。当我说数据隐私时,我指的是用户权利。因为在同样的意义上,会话存储是安全的,不会被窥探,所以用户不知道它们积累了什么样的数据或日志。对于会话ID,您只能获得无法读取的数字/哈希。我相信“真正的”饼干应该清晰易读/供人食用。唉,即使用户对这个问题基本不感兴趣。(再说一遍:cookies对授权数据没有用处。)我可能会混合使用这个方法和@mario的方法。我想我会把代币(可能是我现在的md5)放在饼干里,随时间附上。然后我将使用IP地址存储令牌。我已经实现了作者在5中提到的cookie清除。尽管如此,我并不认为这比我拥有的更安全(除了不来回传输用户名)。哦,好吧。