我想完全基于cookie和sql db验证我的用户。
我的工作是:
1. Once they login, I generate a random string, create a hash from it, save it in the database along with the user id and his IP.
2. I send the hash to the user as cookie
3. Whenever he wants to access something, I verify if his cookie hash matches the one on the server and also if his IP matches. Of yes, he is valid or else, log him out.
4. (As pointed by Akhil) If he clears his browser cookies or anything does not match the information on the database, I clear all the rows with his username and log him out.
Note: I use a session cookie for storing the random hash, which again is generated using the timestamp, and as long as time doesn't repeat itself(I believe), its random in the corect way.
这样好吗?我怎样才能让它变得更好?
答案 0 :(得分:2)
您的方法仅确保用户拥有您生成的随机字符串并使用相同的外部IP地址。有几种滥用这个系统的方法:
如果您的网站没有强制执行HTTPS,那么使用不安全的公共WiFi网络连接的用户可能会面临风险:如果WiFi网络的另一个用户正在侦听网络上发送的所有数据包,他可以拦截您的cookie并使用它作为您的合法用户访问该网站。您的服务器无法区分它们,因为它们都使用相同的IP地址...(有一个Firefox扩展可以让任何人轻松拦截这样的登录cookie:http://en.wikipedia.org/wiki/Firesheep)
此系统在中间攻击时也更容易受到攻击(没有HTTPS)
如果您的Cookie存储在用户计算机的硬盘上,则可以由其他用户重复使用。
因此,为了回答您的问题,在一些条件下,您的系统可被视为安全:
您在网站上强制使用HTTPS(应拒绝未加密的HTTP连接)
你的随机字符串是真正随机的(在PHP中存在产生随机字符串的正确和错误方式)
您的Cookie有一个很短的到期时间,最好设置为会话Cookie。
您应该查看以下相关问题,详细说明您要执行的操作的正确方法:How to secure an authentication cookie without SSL
答案 1 :(得分:2)
- 登录后,我会生成一个随机字符串
醇>
确保使用加密安全方法生成随机字符串。请勿mt_rand
使用openssl_random_pseudo_bytes
等内容。
从中创建哈希,
确保使用secure hashing algorithm(不是MD5,至少是SHA-2)。
将其与用户ID及其IP一起保存在数据库中。
要记住的一件事是,某些互联网连接共享IP地址或有时会更改客户端IP地址(例如AOL或移动设备)。
- 我将哈希发送给用户作为cookie 3.每当他想要访问某些内容时,我都会验证他的cookie哈希是否与服务器上的哈希匹配,以及他的IP是否匹配。是的,他是有效的,否则,请他退出。
醇>
这听起来是一种很好的方式,并且本身没有任何缺陷。我会实现会话超时机制。例如,将上次在数据库中使用的日期存储为滑动到期,查询将仅查询尚未过期的记录。您可以使用后台进程来清除旧的过期记录。
此外,使用HTTPS并在Cookie上设置Secure和HttpOnly标记。这样可以防止它们通过HTTP泄露,但我不会在系统上禁用HTTP,因为无论如何攻击者都有解决方法。
我不会担心同一台计算机上的其他用户正在窃取cookie。如果cookie可以以这种方式被盗,那么用户的机器可能会受到损害,并且您无法使系统保护您无法控制的数据。但是,您可以定期更新令牌(随机字符串),为用户提供滚动cookie。您必须确保只有一个用户可以在同一帐户下一次登录,但这样才有效。
答案 2 :(得分:-1)
不能说这是“坏事”。但在Web开发中,特别是在其安全域相对论中。我建议您下载CodeIgniter(谷歌了解更多信息)会话类(独立版)并使用它。基本的想法和你的一样,但它更成熟,因为它是在如此着名的php框架中开发的。您也可以在该类中执行数据库操作,因为它允许将会话保存到数据库。