一段用户验证的PHP代码,就是验证不成功

<?php
$user=$_POST['user'];
$password=$_POST['password'];
$conn=mysql_connect("localhost","root","123456");
if(!$conn){
die("连接失败".mysql_erron());
}
//设置编码
mysql_query("set names utf8",$conn) or die("编码设置失败");
//选择数据库
mysql_select_db("emplpoyadmin",$conn)or die(mysql_errno());
//对比用户名
$sql="select password from employ where 'user'='$user'" ;

//获取数据
$res=mysql_query($sql,$conn);
//密码验证
if ($row = mysql_fetch_assoc($res)) {
    if ($row['$_password']==md5($password)) {
        header("Location:empManage.php");
        exit();
        }
    } 

    header("Location:denglu.php?errno=1");
    exit();
    mysql_free_result($res);
    mysql_close($conn);

php?>

这段是自己写的用户名密码验证代码,但是密码输入正确后验证页面始终是白板,也不跳转,求救。

该回答引用ChatGPT

首先,您的代码存在一些错误和潜在的安全隐患。mysql_*函数已经被废弃,建议使用mysqli或PDO来连接数据库并执行查询。此外,您的代码容易受到SQL注入攻击。建议使用参数化查询来避免这种情况。


在您的代码中,密码验证部分可能存在一些问题。具体来说,以下行可能会导致问题:

if ($row['$_password']==md5($password)) {

应该将 $_password 改为 password ,因为您在SQL查询中选择的列名是 password 。此外,建议在查询之前对用户输入的密码进行处理,例如剥离不必要的空格、特殊字符等。


另外,建议在条件语句中使用严格的比较运算符(例如 === 或 !== ),以避免类型转换问题。


最后,您的代码似乎存在一些控制流问题。mysql_free_result() 和 mysql_close() 函数应该在 if 语句块之外调用,否则可能会导致无法正常执行。同时,建议使用 die() 或 exit() 函数来结束脚本运行,以避免出现其他未知错误。


下面是一个修正后的示例代码:

<?php
$user = $_POST['user'];
$password = $_POST['password'];

$mysqli = new mysqli("localhost", "root", "123456", "emplpoyadmin");

if ($mysqli->connect_error) {
    die("连接失败:" . $mysqli->connect_error);
}

$mysqli->set_charset("utf8");

$sql = "SELECT password FROM employ WHERE user = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $user);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows == 1) {
    $stmt->bind_result($hashed_password);
    $stmt->fetch();

    if ($hashed_password === md5(trim($password))) {
        header("Location: empManage.php");
        exit();
    } else {
        header("Location: denglu.php?errno=1");
        exit();
    }
} else {
    header("Location: denglu.php?errno=1");
    exit();
}

$stmt->free_result();
$mysqli->close();

希望能对您有所帮助。