You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP登录页面任意输入账号密码都可通过,请问代码哪里存在问题?

问题根因和修复方案:

1. 登录逻辑顺序错误(最高优先级)

你当前登录成功分支的代码顺序完全写反了:

// 原错误代码
if ($found_admin) {
    // Success
    redirect_to("admin.php");  
    $_SESSION["id"] = $found_admin["id"];
    $_SESSION["username"] = $found_admin["username"];
}

redirect_to 函数一般通过header("Location: admin.php")实现跳转,如果函数内部加了exit/die终止脚本执行,那后面写入SESSION的代码永远不会被执行。就算没有加终止逻辑,跳转请求发送后SESSION写入也可能不生效。

修复方案:把SESSION赋值代码放在跳转前面,跳转后强制终止脚本:

if ($found_admin) {
    // Success
    $_SESSION["id"] = $found_admin["id"];
    $_SESSION["username"] = $found_admin["username"];
    // 这里可以补充你需要的其他登录标记写入逻辑
    redirect_to("admin.php");
    exit; // 强制终止后续代码执行
}

2. generate_salt 函数代码被注释导致哈希生成无效

你提供的generate_salt函数里,核心的两行赋值代码被错误写到注释里,导致变量未定义,生成的salt永远是空字符串:

// 原错误代码
function generate_salt($length) {
    // Not 100% unique, not 100% random, but good enough for a salt // MD5 returns 32 characters
    $unique_random_string = md5(uniqid(mt_rand(), true));
    // Valid characters for a salt are [a-zA-Z0-9./] $base64_string = base64_encode($unique_random_string);
    // But not '+' which is valid in base64 encoding $modified_base64_string = str_replace('+', '.', $base64_string);
    // Truncate string to the correct length
    $salt = substr($modified_base64_string, 0, $length);
    return $salt;
}

$base64_string和$modified_base64_string的赋值都在//注释后面,把注释结束后代码单独成行即可:
修复方案:

function generate_salt($length) {
    // Not 100% unique, not 100% random, but good enough for a salt 
    // MD5 returns 32 characters
    $unique_random_string = md5(uniqid(mt_rand(), true));
    // Valid characters for a salt are [a-zA-Z0-9./] 
    $base64_string = base64_encode($unique_random_string);
    // But not '+' which is valid in base64 encoding 
    $modified_base64_string = str_replace('+', '.', $base64_string);
    // Truncate string to the correct length
    $salt = substr($modified_base64_string, 0, $length);
    return $salt;
}

3. password_encrypt 函数salt赋值被注释

同样的问题,$salt的赋值被错误写到注释末尾:

// 原错误代码
function password_encrypt($password) {
    $hash_format = "$2y$10$"; // Tells PHP to use Blowfish with a "cost" of 10
    $salt_length = 22; // Blowfish salts should be 22-characters or more $salt = generate_salt($salt_length);
    $format_and_salt = $hash_format . $salt;
    $hash = crypt($password, $format_and_salt);
    return $hash;
}

修复方案:

function password_encrypt($password) {
    $hash_format = "$2y$10$"; // Tells PHP to use Blowfish with a "cost" of 10
    $salt_length = 22; // Blowfish salts should be 22-characters or more 
    $salt = generate_salt($salt_length);
    $format_and_salt = $hash_format . $salt;
    $hash = crypt($password, $format_and_salt);
    return $hash;
}

修复后你需要重新生成管理员账号的密码哈希,更新到数据库里,否则旧的无效哈希还是会导致密码校验逻辑异常。

4. 补充全局$errors变量初始化

你当前login.php中没有初始化$errors数组,如果validate_presences函数是往全局$errors写入错误信息,未初始化的情况下empty($errors)永远返回true,可能导致校验逻辑失效。
修复方案:在处理登录逻辑前添加初始化:

$username = "";
$errors = array(); // 新增这行
if (isset($_POST['submit'])) {

5. 检查admin.php的登录校验逻辑

如果你现在随便输入账号密码都能直接进入admin页面,大概率是admin.php没有做登录状态校验,任何人直接访问就能进入。你需要在admin.php最顶部添加校验逻辑:

<?php
session_start();
if (!isset($_SESSION['id']) || empty($_SESSION['id'])) {
    $_SESSION["message"] = "请先登录";
    redirect_to("login.php");
    exit;
}
?>

内容的提问来源于stack exchange,提问作者Faraaz Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:48:02