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


PHP secured login cookie, am I doing it right?

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

  1. 当新用户注册时,脚本会创建一个随机散列(加盐(字符串,如下所示:a4c7be8b6426f34c13adc37ba69db2dd,并将其作为"特殊cookie">保存在数据库中
  2. 每个用户都有自己的"特殊cookie"。
  3. 当用户尝试成功登录时,脚本会从数据库中获取他的特殊 cookie 并将其作为 cookie 保存到浏览器中
  4. 在每个页面中,脚本通过将浏览器中保存的cookie与数据库中的"特殊cookie">进行比较来确保用户登录。

这足够安全吗?

顺便说一句,我还有一个问题,在 PHP 5.5 中,单独 password_hash(( 是否足够安全?

提前谢谢。

安全是国家安全局时代的一个伟大篇章。

有不同的方法可以被认为是"安全的",这里有一些你需要注意的要点。如果其中一点不适用于您的应用程序,则它可能不被视为"安全"。

  • 您是否启用了 SSL?

  • 存储在数据库中的密码是否经过哈希+加盐?

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

  • 我可以暴力破解"秘密"、密码或用户名来获取访问权限吗?(限制每个 IP、验证码等的请求数(

  • "秘密"多久更改一次,我建议在每个请求中更改它。

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

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

我认为您的应用程序不安全,除非"特殊机密"在每个请求上更改并且不能被不同的客户端使用。在这种情况下,会话更好,因为它们的值存储在服务器上(在大多数现代配置中(,而不是普通存储在客户端的 cookie 中。将每个"特殊机密"链接到每个客户端的session_id,并在每个请求中更改密钥。

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

您只需要将密码的哈希值存储在数据库中即可进行身份验证。

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

IMO,cookie必须是防篡改的(不能更改服务器保存到浏览器中的cookie(,不可伪造,不应该能够重播,并且服务器也应该很容易验证cookie的有效性。

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

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

让我建议一种更好的方法来创建我在信息安全课上学到的cookie身份验证器。

您可以创建以下格式的 cookie 值:用户名:时间,HMAC(用户名:时间(

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

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

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