PHP安全登录cookie,我做得对吗?

时间:2013-10-10 13:45:54

标签: php security cookies login php-password-hash

我对PHP / MYSQL很陌生,我现在的目标是创建一个安全的简单登录cookie,这就是我所做的:

  1. 当新用户注册时,脚本会创建一个随机哈希(盐渍)字符串,如下所示:a4c7be8b6426f34c13adc37ba69db2dd,并且保存在数据库中 " special饼干"
  2. 每个用户都有自己的"特殊Cookie"
  3. 当用户成功尝试登录时,脚本会从数据库中抓取特殊Cookie 并将其保存为 Cookie到浏览器
  4. 在每个页面中,脚本都会通过比较数据库中"特殊Cookie" 在浏览器中保存的Cookie来确保用户已登录。
  5. 足够安全吗?

    顺便说一下,我还有另一个问题,在PHP 5.5中 password_hash()单独足够安全吗?

    提前致谢。

4 个答案:

答案 0 :(得分:0)

我认为你不需要对cookie值进行哈希处理,因为无论如何都会对session_id进行哈希处理,每当您对用户进行身份验证时,会话ID都将分配给用户并保存到cookie中。

您只需要在db中存储密码的哈希值以进行身份​​验证。

答案 1 :(得分:0)

您描述的登录cookie与没有存储功能的内置PHP会话基本相同。使用会话会更简单。在任何一种情况下,您都应该在用户登录或注销时更改该值。

答案 2 :(得分:0)

安全是NSA时代的一个伟大篇章。

有许多方法可以被视为“安全”,以下是您需要注意的一些方面。如果其中一个要点不符合您的申请,则可能不会被视为“安全”。

  • 您是否启用了SSL?

  • 密码是否在数据库中存储了哈希+盐渍?

  • 客户是否能够更改cookie /会话内容并使用其他人的“秘密”来接管会话?

  • 我可以强制使用“秘密”,密码或用户名来获取访问权限吗? (每个IP的限制请求,CAPTCHA,......)

  • “秘密”的变化频率,我建议在每次请求时更改。

  • 尝试使用公钥/私钥加密,而不是尽可能使用对称散列/加密。

  • 使用更多的盐,发现:<?php $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.'); ?>代表bcrypt

我认为您的申请不安全,除非“特殊秘密”在每个请求中都发生变化,并且不能由其他客户使用。在这种情况下,会话更好,因为它们的值存储在服务器上(在大多数现代配置中),而不是客户端上的cookie。将每个“特殊秘密”链接到每个客户端的session_id,并在每次请求时更改密钥。

答案 3 :(得分:0)

IMO,一个cookie必须是防篡改的(一个不能改变服务器保存到浏览器中的cookie),不可伪造,不应该被重放,而且服务器应该很容易验证有效性饼干。

在您的方法中,cookie是防篡改和不可伪造的,因为服务器创建它,存储它并比较cookie值以验证其有效性,然后将用户视为已登录的用户。

但是,它没有涉及其他两个属性。可以重放cookie,因为它不包含服务器验证其新鲜度的任何信息。 (确实,浏览器会丢弃过期的cookie,但我们不能总是依赖它,因为cookie掌握在拥有浏览器的客户端手中。)另一方面,服务器需要存储额外的值为了维护cookie而每个用户,每次验证cookie时,都需要进行数据库搜索。

让我建议一种更好的方法来创建我在信息安全类中学习的cookie验证器。

您可以使用以下格式创建Cookie值:用户名:时间,HMAC(用户名:时间)

当生成(用户名:时间)字符串的HMAC时,服务器使用仅为服务器所知的密钥,以便哈希值不会在客户端被篡改。 验证cookie时,服务器可以首先验证cookie的逗号分隔字符串中的第二个值是否与使用密钥生成的第一个值的HAMC匹配。验证哈希后,它可以使用cookie中嵌入的时间信息验证cookie是否未过期。

这样您就不必为每个用户存储特殊值来验证他/她登录会话的有效性,也不需要在每次验证时都进行数据库调用。

希望这能为您的问题提供一些见解。