Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关于签名cookie而非会话的提示_Php_Security_Session_Cookies - Fatal编程技术网

Php 关于签名cookie而非会话的提示

Php 关于签名cookie而非会话的提示,php,security,session,cookies,Php,Security,Session,Cookies,我正在考虑放弃PHP的$\u会话(即服务器端会话处理,以增加一些语言不可知的风格),转而使用签名cookie,因为我已经听说了很多关于它们的好消息(Flickr使用它们,所以它们对我来说也应该足够好) 我理解这项技术的基本背景:自由地使用cookies将键值对从客户端传递到服务器,并对它们进行签名以确保值不被篡改 但是,实施签署部分的好方法是什么?也;由于流量可能是HTTP,在防止cookie窃取和/或篡改的同时,是否有一种使用此方法发送敏感数据(如用户密码)的好方法? 我不会对敏感数据使用这种

我正在考虑放弃PHP的
$\u会话
(即服务器端会话处理,以增加一些语言不可知的风格),转而使用签名cookie,因为我已经听说了很多关于它们的好消息(Flickr使用它们,所以它们对我来说也应该足够好)

我理解这项技术的基本背景:自由地使用cookies将键值对从客户端传递到服务器,并对它们进行签名以确保值不被篡改

但是,实施签署部分的好方法是什么?也;由于流量可能是HTTP,在防止cookie窃取和/或篡改的同时,是否有一种使用此方法发送敏感数据(如用户密码)的好方法? 我不会对敏感数据使用这种技术。不过,它与常规会话结合使用会很有用——您可以给客户端一个具有正常会话id的cookie,但也可以在每个页面上包含应用程序需要的所有键/值对。这样,您就可以避免每次页面请求都会占用会话存储空间

您应该力求使数据量非常紧凑,因为它将随每个请求一起发送

考虑到这一点,今后

使用散列对数据进行签名 如果数据不敏感,则可以使用由密钥/值对和共享密钥组合而成的哈希对值进行签名。e、 g

$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时检查哈希。如果根据客户端提供的值计算的哈希值与预期的哈希值不匹配,则表明这些值已被篡改

加密敏感数据 对于敏感数据,您需要加密这些值。查看提供了许多加密函数的扩展

偷饼干 关于cookie窃取,如果您将用户凭据放入cookie并信任它,那么获得该cookie的人可以模拟该用户,直到更改密码为止。一个好的做法是记住如何对用户进行身份验证,并且只有在用户显式登录时才授予某些特权。例如,对于一个论坛,您可能会让某人发布,但不会更改他们的帐户详细信息,如电子邮件地址

“自动登录”cookie还有其他技术,包括为此类cookie提供一个令牌值,您只允许使用一次。关于这个技巧

您还可以考虑将客户端IP包含在签名的cookie中,如果它与呈现cookie的IP不匹配,您可以让他们再次登录。这提供了更多的保护,但不适用于那些明显的IP地址不断变化的人。您可以将其作为可选功能,并为用户提供一种选择退出的方式。只是一个无聊的想法,我还没有在实践中看到这种做法:)

有关解释会话盗窃、劫持和固定的精彩文章,请参阅其中提供了一些可供尝试的技术,例如使用用户代理头作为附加签名。

我正是为此而制作的。所有存储的值都通过RIPEMD160散列(并随时间变化)使用私钥进行安全签名,还可以选择使用RIJNDAEL256进行加密

每个值都与时间戳一起存储,时间戳是可检索的

.


如果愿意,可以使用您选择的哈希/加密/解密函数。

PHP中的签名cookie

这个问题的其他答案有点过时。PHP5.2将
httponly
参数添加到
setcookie
函数中,有效地添加了本机签名cookie支持。根据
setcookie
功能:

“当[设置为]TRUE时,cookie将只能通过HTTP协议访问。这意味着脚本语言(如JavaScript)无法访问cookie。有人建议,此设置可以有效地帮助减少通过XSS攻击进行的身份盗窃(尽管并非所有浏览器都支持此设置),但这种说法经常引起争议。”

将此参数设置为true还将禁用使用其他基于浏览器的工具(如Chrome的DevTools)编辑此cookie的功能。为了使签名cookie更加安全,我强烈建议缩小它使用的路径或域。您可以使用
路径
参数指定这些参数。当然,如果您的网站是通过HTTPS加载的,那么使用
secure
参数保护cookie也不会有什么坏处。结果将是这样一行:

setcookie('signedCookie','uneditable value here', 0, '/', 'www.example.com', TRUE , TRUE);
为什么要使用签名cookies?


事实上,在某些特定情况下,签名cookie是有用的,而其他方法(如会话)则不是。例如,假设所讨论的网站/应用程序使用负载平衡器来提高性能。现在,我们还假设负载平衡器有多个物理服务器,从这些服务器上提供文件,而粘性会话选项不可用。在这种情况下,签名cookie实际上是PHP中保存状态的唯一安全方法。

请注意,如果使用cookie,则必须将会话数据保持在最低限度。。。与通常使用PHP(或其他)脚本进行的操作不同,PHP(或其他)脚本在会话中保存大量内容……您应该知道,cookies是随客户机发出的每个请求一起发送的。因此,通过cookies发送的数据应尽可能小,并将其限制在应该可用的域和路径中。切勿使用ECB!非常好的观察,Alex,链接的文章非常清楚为什么这是个坏主意。我已经从这个答案中删除了使用ECB的示例代码。另外,不要使用自己的密码!HMAC实现了一个类似的目标,并且比我预期的这个方案有更多的关注点;即使用户更改了密码,也不会使原始cookie无效,除非cookie的签名中有某些内容