登录脚本:将用户输入与数据库中已有的数据进行比较


Login Script: Compare User Input with Data Already in the Database

当用户输入用户名和密码时,我试图将此用户输入与数据库中已存储的数据进行比较。为了让它正常工作,如果输入了正确的用户名和密码,屏幕应该显示"是",否则应该显示"否"。

现在,每当用户在登录中输入任何信息(无论是否正确),屏幕都是空白的。请告知需要做些什么来解决这个问题,谢谢。

要访问登录页面,请访问:http://www.montecarlohotel.co.nf/Membership.html用户名&密码已在数据库中:585791,密码1

<!DOCTYPE html>

<html>
   <head>
      <meta charset = "utf-8">
      <title>Search Results</title>
      <style type = "text/css">
         body{font-size: 300%;}
      </style>
   </head>
   <body>
      <?php

         $query = "SELECT *
                   FROM UserAccount
                   WHERE Username = '$usr' and Password = '$password'";
         $usr = $_POST['memberid'];
         $password = $_POST['password'];                  
         // Connect to MySQL
         if ( !( $database = mysql_connect( "xxxxxxxx", "xxxxxxx", "xxxxxxxx" ) ) )
            {
              die( "<p>Could not connect to database</p></body></html>" );
            }
         // open hotel database
         if ( !mysql_select_db( "1994715_hotel", $database ) )
            {
              die( "<p>Could not open Hotel database</p></body></html>" );
            }
         // query hotel database
         if ( !( $result = mysql_query( $query, $database ) ) )
            {
              print( "<p>Could not execute query!</p>" );
              die( mysql_error() . "</body></html>" );
            }

      for ($counter = 0; $row = mysql_fetch_row($result); ++$counter) 
          {
           if($result['Username'] == $usr && $result['Password'] == $password)
             {
              print("Yay");
             }
           else
             {
              print("No");
             }
          }

      ?>
   </body>
</html>

您提供的代码非常不安全:

  • 正如Jay Blanchard所指出的,它很容易受到SQL注入的攻击
  • 您正在以明文形式存储用户密码这是你能做的最糟糕的事情。

如果重构为使用PDO(强烈推荐)和PHP的密码哈希API,则可以安全轻松地实现此功能。

首先,记下这些台词。。。

mysql_connect("localhost", "username", "password");
mysql_select_db("database");

并像这样重写:

$db = new PDO("mysql:localhost;dbname=database", "username", "password");

每个查询都需要$db对象,但一旦你习惯了它,它就不会那么糟糕了

$stmt = $db->prepare("SELECT * FROM UserAccount WHERE Username = ?");
if ($stmt->execute(array($_POST['username']))) {
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $firstRow = $data[0];
    if (password_verify($_POST['password'], $firstRow['password'])) {
        // Success, mark them as logged in here.
        $_SESSION['UserId'] = $data[0]['UserId'];
    }
}

请注意,在查询字符串中,我使用了?,而不是连接$_POST['username']变量?相反,我把它作为一个数组传递给execute()这就是编写数据库代码的方式

注意:这需要在注册过程中使用password_hash(),而不是将密码直接存储在数据库中您必须始终使用password_hash()password_verify()作为密码

进一步阅读:

  • 如何防止PHP中的SQL注入
  • 实现安全的用户身份验证
  • 密码学基本术语和概念综述

最后,还有一个学习应用程序安全性的精心策划的列表。有丰富的材料可用于学习编写安全的web应用程序。请好好利用这一点,尽可能多地学习。

更改此项:

$query = "SELECT *
                   FROM UserAccount
                   WHERE Username = '$usr' and Password = '$password'";
         $usr = $_POST['memberid'];
         $password = $_POST['password']; 

到此:

$usr = $_POST['memberid'];
$password = $_POST['password']; 
$query = "SELECT *
                   FROM UserAccount
                   WHERE Username = $usr and Password = $password";

我刚刚修正了你的语法,建议你使用PDO。