我对PHP / MYSQL很陌生,我现在的目标是创建一个安全的简单登录cookie,这就是我所做的:
足够安全吗?
顺便说一下,我还有另一个问题,在PHP 5.5中 password_hash()单独足够安全吗?提前致谢。
答案 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是否未过期。
这样您就不必为每个用户存储特殊值来验证他/她登录会话的有效性,也不需要在每次验证时都进行数据库调用。
希望这能为您的问题提供一些见解。