2014-03-02 56 views
2

我想完全基于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

我建议不要重新发明轮子。除非你试图改进现有的方法,否则你可能不会自己实现这一点。 –

+0

如果任何清除cookie或Cookie过期,会发生什么情况?他将如何能够登录?你永远不能在IP地址上进行中继。你如何处理动态IP地址?我认为保持密码将是一个更简单的方法 –

+0

“使用时间戳生成”似乎不是随机的。如果字符串是真正随机的,那么散列随机字符串看起来像是一个额外的,不必要的步骤。 –

回答

-1

一个不能说这是“坏”。但是在Web Development中,特别是在它的安全域相关性谈判中。我建议你下载一个CodeIgniter(google了解更多信息)Session Class(独立版本)并使用它。基本的想法和你的一样,但是它是在这样一个着名的PHP框架中开发的,因此它更加成熟。您也可以在该类中执行数据库操作,因为它允许将会话保存到数据库。

2

您的方法只能确保用户拥有您生成的随机字符串并使用相同的外部IP地址。存在滥用这一系统的几个方法:

  • 如果您的网站并没有强制HTTPS然后使用不安全的公共WiFi网络可能是在危险连接用户:如果Wi-Fi网络的其他用户正在听所有在网络上发送数据包时,他可以拦截您的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

2
  1. 一旦登录,我生成一个随机字符串

请确保您使用密码安全的方法来生成随机字符串。请勿使用mt_rand使用诸如openssl_random_pseudo_bytes之类的东西。

从它创建一个散列,

请务必使用一个secure hashing algorithm(不MD5,和至少SHA-2)。

将它保存在数据库中的用户ID和他一起IP。

有一点要记住的是,一些互联网连接共享IP地址,或者有时会改变客户端IP地址(例如AOL或移动)。

  1. 我发送哈希给用户每当他想要访问的东西饼干3,我确认如果他的Cookie哈希值相匹配的服务器上的之一,也是,如果他的IP相匹配。是的,他是有效的,否则,注销他。

这听起来像是一个很好的做法,它本身没有缺陷。我会实现一个会话超时机制。例如,将上次在数据库中使用的日期存储为滑动到期,并且查询将只查询尚未过期的记录。您可以运行后台进程来清除旧的过期记录。

另外,使用HTTPS并在Cookie上设置SecureHttpOnly标志。这将防止他们通过HTTP泄漏,但我不会像在系统上禁用HTTP一样远,因为如果攻击者无论如何都有解决方法。

我不会担心cookie被另一个用户在同一台​​机器上盗取。如果cookie可以以这种方式被窃取,那么用户的机器可能会被破坏,并且您无法让系统保护超出您的控制范围的数据。但是,您可以定期更新令牌(随机字符串),为用户提供滚动cookie。您必须确保只有一个用户可以在同一个帐户下同时登录,但这样做很有效。