【问题标题】:How do I authenticate a user in PHP / MySQL?如何在 PHP / MySQL 中对用户进行身份验证?
【发布时间】:2009-03-26 13:43:40
【问题描述】:

所以最近我学会了如何正确地将用户名和密码添加到数据库中。 我的数据库是usersys,存储用户信息的表叫userdb。该表有两列 - 用户名(主)、密码。

注册表很好用,将用户输入正确地输入数据库,并检查用户的用户名是否已经在数据库中。

话虽如此,我想问是否有人可以帮助我创建登录脚本。到目前为止,这就是我所拥有的:

$username = $_POST['username'];
$password = $_POST['password'];
$displayname = $_POST['username'];
$displayname = strtolower($displayname);
$displayname = ucfirst($displayname);           
echo "Your username: " . $displayname . "<br />";

mysql_connect("localhost", "root", "******") or die(mysql_error());
echo "Connected to MySQL<br />";

mysql_select_db("usersys") or die(mysql_error());
echo "Connected to Database <br />";

$lcusername = strtolower($username);
$esclcusername = mysql_real_escape_string($lcusername);
$escpassword = mysql_real_escape_string($password);

$result = mysql_query("SELECT * FROM userdb WHERE username='$esclcusername' AND     password='$escpassword'") or die(mysql_error());
$row = mysql_fetch_array( $result );
$validateUser = $row['username'];
$validatePass = $row['password'];

POST 数据来自上一个登录页面。我希望此脚本检查表 (userdb) 并找到用户从上一个表单中输入的用户名所在的行,并验证输入的密码是否与 userdb 表中该行中设置的用户名密码匹配。

我还想要某种方法来检查输入的用户名是否存在,如果在表中找不到输入的用户名,则告诉用户输入的用户名不存在。

【问题讨论】:

  • 您应该尽可能重用现有的身份验证框架,因为它确实很复杂。例如,看看github.com/delight-im/PHP-Auth,它既与框架无关,也与数据库无关。

标签: php authentication


【解决方案1】:

这不是对这个问题的直接答案,而是一个很好的增值。 您应该使用 MYSQL SHA1 函数对密码进行加密,然后再存储到数据库中。

$user = $_POST['userid'];
$pwd = $_POST['password'];
$insert_sql = "INSERT into USER(userid, password) VALUES($user, SHA1($pwd))";

$select_sql = "SELECT * FROM USER WHERE userid=$user AND password=SHA1($pwd))";

【讨论】:

  • +1 表示非常重要的一点。不过有两个更正: 1. 代码应该使用 mysql_escape_string/mysql_real_escape_string() 以避免被 SQL 注入绕过。 2. 最好使用盐进行散列,以避免被彩虹表破解。见:tinyurl.com/jwb8o
  • 这个答案主要是不安全的,因为它没有在密码周围使用引号,即使主要问题显示了mysql转义函数的使用,这仍然允许以@987654323的形式进行sql注入@
【解决方案2】:

您可以使用会话。会话是全局变量,设置后会在用户浏览网站时与用户保持一致。

既然你是学PHP的,在官网try out this tutorial

但是理论上你会做的是当用户名和密码匹配时,你设置一个会话变量

$_SESSION["auth"] = true;
$_SESSION["user_id"] = $row["user_id"];

然后检查用户是否通过了身份验证。

【讨论】:

    【解决方案3】:

    一种方法(免责声明:不一定是最佳实践):

    $result = mysql_query("SELECT id FROM userdb WHERE username='$esclcusername' AND  password='$escpassword'") or die(mysql_error());
    $row = mysql_fetch_array( $result );
    $id = (int)$row['id'];
    if($id > 0) {
        //log in the user
        session_start();
        $_SESSION['userId'] = $id;
        $_SESSION['username'] = $displayname;
    }
    

    ...以及在需要身份验证的页面上:

    session_start();
    if(!isset($_SESSION['userId'])) {
        die('You need to be logged in!!!');
    } else {
        echo 'Welcome ' . $_SESSION['username'];
    }
    

    阅读有关 PHP 的更多信息sessions

    【讨论】:

      【解决方案4】:

      我喜欢在任何登录 POST 中同时使用 $_SESSIONMYSQL 检查。这应该有助于开始做一些事情。

      $username = mysql_real_escape_string($_POST[username]);
      $password = strip_tags($_POST[password]);
      $password = sha1($password);
      
      if(isset($username) && isset($password) && !empty($username) && !empty($password))
      {
      $sql = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'");
      
      //Check the number of users against database
      //with the given criteria.  We're looking for 1 so 
      //adding > 0 (greater than zero does the trick). 
      $num_rows = mysql_num_rows($sql);
      if($num_rows > 0){
      
      //Lets grab and create a variable from the DB to register
      //the user's session with.
      $gid = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'");
      $row = mysql_fetch_assoc($gid);
      $uid = $row[userid];
      
      // This is where we register the session.
      $_SESSION[valid_user] = $uid;
      
      //Send the user to the member page.  The userid is what the 
      //session include runs against.
      header('Location: memberpage.php?userid='.$userid);
      }
      
      //If it doesn't check out -- throw an error.
      else
      {
      echo 'Invalid Login Information';
      }
      }
      

      注意:您需要以session_start() 开始页面文件并创建一个单独的会话检查,包括使用session_start() 声明,然后是您的进度,例如if($_SESSION[valid_user] != $userid) 做点什么。

      【讨论】:

        【解决方案5】:

        您可以使用 select 语句从 MySQL 中检索指定用户名的密码。如果结果集为空,则表中没有用户名。

        如果您需要在多个 php 页面中对用户进行身份验证,那么一种选择是使用会话 (http://www.php.net/manual/en/function.session-start.php)。

        另外,我认为您应该考虑安全性,即防止 SQL 注入:

        $variable = mysql_real_escape_string($_POST['variable'])
        

        并避免“死亡”(处理错误并从脚本返回用户友好的消息)。

        【讨论】:

          【解决方案6】:

          我也会考虑不在您的数据库中存储密码。使用 MD5 或 SHA1 的一种方法是在数据库级别添加一层安全性。

          请参阅http://php.net/md5http://php.net/sha1 了解更多信息。

          【讨论】:

            【解决方案7】:

            我同意在验证用户时使用 SESSION 变量的想法。

            验证用户的简单方法如下

            //connect the mysql_db
            $mysql_connect()
            $mysql_select_db() 
            
            //reading from mysql table
            $res="SELECT * FROM table WHERE name=$username AND password=$password";
            $val=mysql_query($res);
            
            //authentication
            $count=mysql_num_rows($val);
            if($count==1)
            //authenticate the user
            else
            through an error
            

            【讨论】:

            • 这个答案主要是不安全的,因为它没有在密码周围使用引号,即使主要问题显示了mysql转义函数的使用,这仍然允许以@987654322的形式进行sql注入@
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-11
            • 2021-11-30
            • 2012-05-06
            • 1970-01-01
            • 2021-06-11
            • 2021-07-20
            相关资源
            最近更新 更多