我的 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 登录脚本出现以下错误的主要内容,如果未能解决你的问题,请参考以下文章