设计PHP用户登录系统

时间:2012-11-12 18:16:44

标签: php login system

所以我期待设计一个高安全性的php用户系统。我决定从登录/会话结束开始。我希望有人看看我的计划并通知我漏洞和安全漏洞。

这是我第一次尝试在这样的级别上创建系统,如果您发现问题,可以向我发送资源以帮助我解决问题。

连接数据库 *我将使用MYSQL,因此它是您的标准数据库连接存储在站点根目录之外的文件中。

注册 *注册将是一个简单的表单,我使用存储在外部文件中的函数来清理输入并防止SQL注入

// A function to sanitize input for data being input into a database
function sanitizeinput($rawinput) {
$sanitizedinput = mysql_real_escape_string($rawinput);
return $sanitizedinput;
}

我有什么需要这个功能来保护它吗?

要使用SHA-512或BCrypyt对密码进行哈希处理,我做了一些研究,并且看到很多人说MD5不再足够安全,我想确保最好的安全性,所以应该做什么我用哈希密码。

我还使用以下代码片段添加了一个随机生成的salt,该片段附加在散列密码的前面,然后重新散列。然后,盐是以纯文本格式存储在数据库中,如果我考虑加密这个以获得额外的安全性吗?

当用户登录时,将对其输入的密码进行哈希处理,添加并重新添加数据库中的salt,然后将其与存储在数据库中的密码进行比较。

如果密码匹配,则会创建会话,然后锁定到单个IP地址和用户代理。会话将在短时间后过期。该会话仅用于存储登录令牌,用户名和密码当然不会存储在会话中。

当用户登录时,令牌将被存储到数据库中,并为其分配用户名,这样我们就可以使用令牌安全地从数据库中提取用户详细信息,而不会将风险存储在会话中。

如果密码不正确,用户将无法登录...呃,我也会对此强制执行暴力保护,经过三次尝试后,用户IP和用户代理将被锁定15分钟和十分之后失败的尝试在防火墙中被阻止。

我觉得我忘了什么,但我不能直接把手指放在上面。

非常感谢任何帮助或建议。

4 个答案:

答案 0 :(得分:2)

我绝不是这方面的专家,但首先要切换到PDO以连接到mySQL。这似乎有点困难,但如果正确使用,可以100%保护您免受任何试图进行sql注射的人的影响。对于加密,我使用它来为每个用户生成一个随机盐:

    function generateSalt($length, $chars)
{
  $randString = '';
  $charLength = strlen($chars);
  for($count = 0; $count < $length; $count++)
  {
    $randString .= substr($chars, mt_Rand(0, ($charLength-1)), 1);
  }
  return $randString;
} 

如果你给它一个字符串,它会从该字符串中的字符中吐出给定长度的盐。然后我相信我使用河豚是因为它不容易破裂。

您是否考虑过XSS漏洞?我还没有,需要继续这样做。确保用户不会将html或javascript代码注入到您的数据库中,以后可能会在页面的某个位置显示。

祝你好运。

编辑: 这是我用于“哈希”的内容

$cryptOptions = '$2y$10$' . $salt . '$';
$hashedPassword = crypt($password1, $cryptOptions);

答案 1 :(得分:0)

为什么要将盐存储在数据库中?假设某人有权访问您的数据库 - 他将拥有密码和盐。如果您的盐是硬编码的或其他地方,他只会使用哈希密码。如果攻击者可以完全访问您的系统,那么这无关紧要。

此外,您是否会使用https进行登录操作?

假设您有多个数据库连接并且它们具有不同的编码 - 您应该将正确的链接传递给您的清理程序功能。顺便说一下,将mysql_real_escape_string包装到另一个不添加东西的功能(但实际上限制了实际功能)的好处是什么? 我鼓励你使用PDO。

答案 2 :(得分:0)

几个月前在Java中实现了类似的原型。

从我看来,它看起来与我的相似。我做过的一些事情(或者至少是计划好的事情),我从你的解释中看不出来

  1. 显然使用TLS保护HTTP通道,否则您将以明文形式发送密码。
  2. 使用一些关键的拉伸函数,例如http://en.wikipedia.org/wiki/PBKDF2,这样蛮力攻击的计算量就会更大。
  3. 我多次应用哈希。 (我使用1024次迭代),再次防止暴力攻击。如果我不得不再做一次,我宁愿花时间实施2。
  4. 会话应在最后访问时间到期。
  5. 希望能给你一些额外的想法。

答案 3 :(得分:0)

道歉我无法评论m02ph3u5的帖子所以我必须发布另一个答案。在数据库中存储盐是完全标准的。盐的存在的原因是为了防止彩虹桌上的暴力强迫。彩虹表是预先计算的哈希值,可以快速破解数据库中的所有密码。使用盐,即使是攻击者已知的盐,也不能预先计算彩虹表。这意味着人们必须暴力破解每个密码。这很好,因为如果你使用类似河豚的算法,那么破解数百个密码变得不切实际。

这不是让密码无法破解的方法。这是一种破解所有密码不切实际的方法。

编辑:如果他们获得了对您的数据库的访问权限,他们将只有您的哈希密码和盐。他们仍然需要明文密码。

EDIT2:所以我们的想法是他们可以访问该网站,因此我们当时唯一想做的就是保护密码。通常人们会重新使用密码。哈希真的只是为了保护那些人。