Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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 - Fatal编程技术网

PHP-在cookie中存储密码是否安全?

PHP-在cookie中存储密码是否安全?,php,Php,可能重复: 在登录系统中,如果用户希望保持登录状态,则需要将密码存储在浏览器cookie中。我已经研究了很多以前的问题,发现在浏览器cookie中存储密码是不安全的。我不知道我是否做过类似的事情 $string = 'snfcikkfbnvekrew'; $salt = md5($passwrod.$string); $password = md5(sha1(md5("$salt$string$salt"))); //or some other random sequenc

可能重复:

在登录系统中,如果用户希望保持登录状态,则需要将密码存储在浏览器cookie中。我已经研究了很多以前的问题,发现在浏览器cookie中存储密码是不安全的。我不知道我是否做过类似的事情

$string = 'snfcikkfbnvekrew';
    $salt = md5($passwrod.$string); 
    $password = md5(sha1(md5("$salt$string$salt")));  //or some other random sequence of encryption functions

我只是想知道,如果有人访问cookie,会执行什么样的攻击

为什么需要在cookie中存储密码?为什么不使用其他用户标识符,例如内部用户ID或某种临时值


“存储”和“密码”是两个很少一起使用的词,使用时应仔细检查。

永远不要尝试将密码存储在cookie中。最好将会话id存储在cookie中,而将密码存储在服务器上的会话中。你无法想象黑客解码你刚刚编码的字符串有多容易。

如果有人访问cookie,即使它是散列的,他们在cookie过期之前拥有与你网站用户相同的访问权限。即使在密码过期之后,除非服务器上的密码发生了更改,否则仍然可以使用相同的哈希值登录

如果您希望允许他们在不登录的情况下再次访问,请使用存储在其用户帐户中的其他随机令牌值设置cookie,而不是存储密码。在每次页面访问和表单提交时,您都可以重新生成和存储一个新的随机令牌,并将cookie重置为新值。这样,存储的值就会不断变化,因此,如果恶意用户在传输过程中获得了cookie,那么在他们能够使用cookie时,cookie可能已经发生了变化


最后,如果要存储任何值以供以后登录,则应该通过SSL执行此操作,并且只通过SSL发送cookie。

密码本身不需要存储在cookie中,因为您永远无法检索它并将其反转以证明它是正确的密码。但是,如果你想使用密码/电子邮件/recId/任何你可以在内部检查的算法组合,那就继续吧,把你的字符串加盐。我可能会使用一些未加密或可逆UID的组合以及唯一且可重新创建的加密密钥,这样我就可以查找相关记录并进行验证,例如

select 1 as loggedIn from userTable as u where u.uid=[cookie.uid] and md5(concat(u.email,u.accountcreated,u.lastlogin))=[cookie.hash] 

使用
$\u会话
而不是调制您自己的cookie系统,而是让会话持续一段时间:

// keep user logged in 6 months
session_set_cookie_params ( $lifetime = 6 * 30 * 24 * 60 * 60 );
session_start();

if ($login == TRUE) {
    $_SESSION["user"] = $user_name_or_id;
}

我成功地使用了“安全Cookie协议”(6页)中解释的方法


这个问题的第一部分在这里:md5和sha1不是加密。它们是散列函数。把它们想象成绞肉机。很容易拿一头牛做汉堡包——(实际上)不可能拿着汉堡包做一头牛;现在你在问做上述事情的最佳方法?@mario:得票最高的答案是“在cookie中存储密码的咸杂凑”。这就是我问这个问题的原因。那么也许你应该接受这个答案:D(需要更多的配置,对于高访问量是不可取的,因为会话存储将不断增长。)公平地说,我们真的认为OP是在谈论高访问量站点吗?在大多数情况下,PHP的内置会话处理很好,而滚动自己的会话常常是浪费时间,甚至更糟。。有比让会话持续那么长时间更好的方法…@ircmaxell:这听起来像是一个广义的建议,永远不要使用会话。您很容易受到上述问题的影响,这取决于DoS请求量,而不是实际的存储时间。在这种特殊情况下,会话的使用和创建实际上取决于[x]保持登录复选框和成功登录。授权会话越少,会话劫持的可能性就越小。同意。你想要存储一个盐腌的杂凑或者一些你知道并且可以很容易地重新计算但不容易被猜测的东西。在登录时使用时间戳,加上你最喜欢的数学老师的名字和月相,同样有效(而且风险更小)。