【问题标题】:Most secure php user athentication function最安全的php用户认证功能
【发布时间】:2011-05-12 23:28:10
【问题描述】:

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

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

$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;

【问题讨论】:

    标签: php mysql security authentication


    【解决方案1】:

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

    另外,$query1 只能评估为真或假,所以最后的else 部分是无用的,永远不会到达。你的 3 个分支就相当于这样:

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

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

    【讨论】:

      【解决方案2】:

      此代码存在多个问题:

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

      【讨论】:

      • SHA1 是目前 PHP 中唯一的 SHA 系列哈希函数吗?
      • 没有。请参阅 hash()hash_algos() 函数。如果您的数据库不支持您选择的相同哈希函数,您可能必须将值提取到 PHP 脚本中,然后运行另一个查询……因此请谨慎选择。在我看来,SHA1 目前非常安全。
      【解决方案3】:

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

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

      但是,cdhowie 指出的漏洞必须完全修复。

      【讨论】:

      • 我应该注意,为了简单起见,我删减了代码。我将 $email 和 $password 变量传递给已经清除注入漏洞的函数。我实际上使用的是 SHA1。虽然,我没有调用 mysql_free_result。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2018-07-08
      • 2016-11-20
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      相关资源
      最近更新 更多