创建安全用户身份验证功能的最佳方法是什么?下面是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;
答案 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)
此代码存在多个问题:
') OR 1=1 OR '' = ('
的电子邮件地址时会发生什么?)您应该查看mysql_real_escape_string,或考虑使用参数化查询。mysql_free_result
返回的资源上调用mysql_query
,这将泄漏MySQL服务器上的资源(直到脚本终止),并可能阻止同一脚本中的将来查询执行。< / LI>
答案 2 :(得分:0)
这取决于攻击者可以访问的位置。如果他以某种方式访问数据库,则建议的哈希类型更改很重要。
如果他不这样做,那么限制登录失败次数以避免暴力攻击更为重要。
然而,cdhowie指出的漏洞必须要修复。