我正在考虑放弃PHP $_SESSION
(即服务器端会话处理,添加一些与语言无关的风格)并使用签名的cookie代替,因为我听到了很多关于它们的好处(Flickr使用它们,所以它们应该是好的对我来说也足够了).
我理解该技术的基本上下文:使用cookie自由地将键值对从客户端传递到服务器,并对它们进行签名以确保值不被篡改.
但是实施签名部分的好方法是什么?也; 由于流量可能是HTTP,使用此方法发送敏感数据(例如用户密码)是否有好办法,同时防止cookie窃取和/或篡改?
我不会将此技术用于敏感数据.它可以与常规会话结合使用 - 您可以为客户端提供具有正常会话ID的cookie,但也包括应用程序在每个页面上所需的所有键/值对.这样,您可以避免为每个页面请求访问会话存储.
您的目标应该是保持数据量非常紧张,因为它将随每个请求一起发送.
考虑到这一点,从......
如果数据不敏感,您可以使用由键/值对和共享密钥组合而成的sha1哈希对值进行签名.例如
$values=array( 'user_id'=>1, 'foo'=>'bar' ); $secret='MySecretSalt'; $plain=""; foreach($values as $key=>$value) { $plain.=$key.'|'.$value.'|'; } $plain.=$secret; $hash=sha1($plain);
现在给客户端一个包含所有值和哈希值的cookie.您可以在呈现cookie时检查哈希值.如果您根据客户端提供的值计算的哈希值与预期哈希值不匹配,则表示值已被篡改.
对于敏感数据,您需要加密值.查看提供大量加密功能的mcrypt扩展.
关于cookie窃取,如果您将用户凭据放入cookie并信任它,那么获得该cookie的人可以冒充该用户,直到密码被更改为止.一个好的做法是记住您对用户进行身份验证的方式,并且只有在用户明确登录时才授予某些权限.例如,对于论坛,您可能会让某人发帖,但不会更改其帐户详细信息,如电子邮件地址.
"自动登录"cookie还有其他技术,包括为这些cookie提供一个令牌值,您只允许使用一次.这是一篇关于该技术的好文章.
您还可以查看在签名cookie中包含客户端IP,如果它与提供cookie的IP不匹配,则会让他们再次登录.这提供了更多保护,但对于明显IP地址不断变化的人不起作用.您可以将其设为可选功能,并为用户提供退出选项的方法.只是一个无所事事的想法,我没有看到在实践中完成:)
有关解释会话被盗,劫持和录制的好文章,请参阅会话和Cookie,它们提供了一些其他技巧,例如使用User-Agent标头作为附加签名.
我完全为此目的制作了CookieStorage.所有存储的值都通过RIPEMD160散列(并随时间盐化)使用您的私钥进行安全签名,并可选择使用RIJNDAEL256进行加密.
每个值都与时间戳一起存储,时间戳是可检索的.
签名的例子.
加密示例.
如果您愿意,可以使用您选择的哈希/加密/解密函数.