我的 PHP 登录脚本出现以下错误

Posted

技术标签:

【中文标题】我的 PHP 登录脚本出现以下错误【英文标题】:My PHP login script is giving the following error 【发布时间】:2019-03-24 02:05:11 【问题描述】:

您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的“密码='$2y$10$QV6'' 附近使用的正确语法

我是服务器端脚本的新手,请查看下面的语法并在必要时调整它或帮助我针对此错误提供替代解决方案。

<?php

$tbl_name = "user_accounts"; // Table name

// Connect to server and select database.
$mysqli = new mysqli("localhost", "root", "", "ems");

// email and password sent from form
$email = $_POST['email'];
$password = $_POST['password'];

if (!$_POST['email'] | !$_POST['password']) 
    print "<script>alert('Your email & password do not match!');
    javascript:history.go(-1);</script>";
    exit;


// To protect MySQL injection
$email = stripslashes($email);
$password = stripslashes($password);
$email = mysqli_real_escape_string($mysqli, $email);
$password = mysqli_real_escape_string($mysqli, $password);

$hash = password_hash($password, PASSWORD_BCRYPT);

$sql = "SELECT account_type, email and password FROM $tbl_name WHERE email='$email', password='$hash'";
$mysqli_result = mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));

// Mysql_num_row is counting table row
$count = mysqli_num_rows($mysqli_result);

// If result matched $email and $password, table row must be 1 row

if ($count == 1) 

    // Register $email, $password and redirect to file "index.php"
    $_session['email'] = $email;
    $_session['password'] = $password;

    //Checking User Account Type
    if ($_SESSION['account_type'] == 'user') 
        header("location:user.php");
     else if ($_SESSION['account_type'] == 'admin') 
        header("location:admin.php");
     else 
        print "<script>alert('This Account Doesn't Exist!');
            javascript:history.go(-1);</script>";
        exit;
    
 else 
    echo "Wrong email or Password";

?>

【问题讨论】:

email='$email', password='$hash' 应该是email='$email' AND password='$hash' 很高兴您对 SQL 注入有所考虑,但我认为您的防御措施不够充分。帮自己一个忙,学习如何使用准备好的语句。 【参考方案1】:

试试这个

$sql="SELECT account_type, email and password FROM $tbl_name WHERE email='".$email."', password='".$hash."'";
    $mysqli_result=mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));

【讨论】:

看看我的回答,密码哈希使用盐,密码和数据库中的不一样。【参考方案2】:

password_hash 每次都会生成一个新的哈希,即使是相同的值。

您的查询应该只查询电子邮件,然后执行password_verify($password, $passwordFromQuery)

更多关于password_hash()here和关于password_verify()here的信息

我建议使用准备好的语句。阅读更多关于它的信息here

【讨论】:

谢谢你的建议,一定会考虑的【参考方案3】:

这里有几个问题:

    您不使用逗号分隔条件,而是使用AND 您不能像这样检查密码哈希,因为每次动态生成盐时它都会有所不同。相反,您应该从行中获取密码并使用密码比较功能password_verify()。 您应该使用准备好的语句而不是转义您的输入以避免 sql 注入。

【讨论】:

我会查看准备好的声明,再次感谢您提供一些可靠的咨询

以上是关于我的 PHP 登录脚本出现以下错误的主要内容,如果未能解决你的问题,请参考以下文章

我的 PHP 脚本无法上传 50M 以上的图片

Bash 脚本错误:“函数:未找到”。为啥会出现这种情况?

PHP -> CLI 已停止工作

带有帐户激活检查的 PHP 登录页面 [重复]

安全的LDAP PHP脚本?