0

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

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

这足够安全吗?

顺便说一句,我还有一个问题,在 PHP 5.5 中,仅password_hash()就足够安全了吗?

提前致谢。

4

4 回答 4

0

安全是 NSA 时代的重要篇章。

有不同的方式可以被认为是“安全的”,这里有一些你需要注意的点。如果这些点之一对您的应用程序不正确,则它可能不被视为“安全”。

  • 您是否启用了 SSL?

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

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

  • 我可以暴力破解“秘密”、密码或用户名来获得访问权限吗?(限制每个 IP 的请求,验证码,...)

  • “秘密”多久更改一次,我建议在每次请求时更改它。

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

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

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

于 2013-10-10T15:05:03.827 回答
0

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

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

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

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

您可以按以下格式创建 cookie 值:username:time,HMAC(username:time)

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

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

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

于 2013-10-12T20:10:19.123 回答
0

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

于 2013-10-10T14:48:22.040 回答
0

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

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

于 2013-10-10T13:51:39.597 回答