最安全的php用户认证功能

时间:2010-11-20 03:32:18

标签: php mysql security authentication

创建安全用户身份验证功能的最佳方法是什么?下面是php函数的核心,它接受用户名和密码并对数据库进行检查。

我对查询及其返回值特别感兴趣。使用'else if($ query1)'验证和设置会话变量的最佳方法是什么?另外,最好为会话变量设置什么值?电子邮件地址,用户名,bool变量,主键索引等?

$query1 = mysql_fetch_array(mysql_query("SELECT primaryKey 
                                           FROM loginInfo 
                                          WHERE email = md5('$email') 
                                            AND password = md5(CONCAT('$password',salt)) 
                                          LIMIT 1"));
if (!$query1)
  return false;
else if ($query1) {
  $_SESSION['userNumber'] = $query1[primaryKey];
  return true;
}
else
  return false;

3 个答案:

答案 0 :(得分:1)

MD5已知漏洞,不再被视为安全漏洞。您应该切换到更强大的哈希,例如SHA-2

此外,$query1只能评估为真或假,因此最终的else部分无用且永远无法到达。你的3个分支就相当于这个:

if (!$query1)
    return false;
else { // else $query1 is obviously true
    $_SESSION['userNumber'] = $query1[primaryKey];
    return true;
}

在会话中没有存储“最佳价值”的东西,但主键通常是一个方便的选择,因为它保证是唯一的,并且还提供了查找剩余细节的简便方法。此外,如果您发现自己经常显示某些信息,例如用户名,您还可以将其存储在会话中以便于访问。

答案 1 :(得分:1)

此代码存在多个问题:

  • SQL注入漏洞。 (当用户输入') OR 1=1 OR '' = ('的电子邮件地址时会发生什么?)您应该查看mysql_real_escape_string,或考虑使用参数化查询。
  • 您永远不会在mysql_free_result返回的资源上调用mysql_query,这将泄漏MySQL服务器上的资源(直到脚本终止),并可能阻止同一脚本中的将来查询执行。< / LI>
  • MD5因漏洞而被弃用。请考虑在SHA系列中使用哈希值。

答案 2 :(得分:0)

这取决于攻击者可以访问的位置。如果他以某种方式访问​​数据库,则建议的哈希类型更改很重要。

如果他不这样做,那么限制登录失败次数以避免暴力攻击更为重要。

然而,cdhowie指出的漏洞必须要修复。