PHP 登录尝试计数失败问题排查与修复教程

花韻仙語
发布: 2025-09-17 16:42:01
原创
659人浏览过

php 登录尝试计数失败问题排查与修复教程

本文旨在解决PHP登录尝试计数不准确的问题。通过分析常见错误原因,并提供修正后的代码示例,帮助开发者实现正确的登录尝试计数功能,并在达到指定次数后重定向到注册页面。本文将重点关注会话管理和表单数据传递,以确保计数器的持久性和准确性。

在PHP中实现登录尝试计数,并在达到一定次数后将用户重定向到注册页面,需要仔细处理会话管理和表单数据的传递。原始代码的问题在于每次登录失败后重定向到index.php,导致 $atmp 变量重置为0,无法正确累积登录尝试次数。以下是如何修复并改进代码的步骤。

1. 使用会话(Session)存储尝试次数

会话允许我们在用户浏览网站的不同页面时保持数据。我们需要启动会话,并在会话中存储登录尝试次数。

立即学习PHP免费学习笔记(深入)”;

<?php
session_start(); // 启动会话

// 初始化尝试次数,如果会话中不存在
if (!isset($_SESSION['login_attempts'])) {
    $_SESSION['login_attempts'] = 0;
}

if (isset($_POST['login'])) {
    $user = $_POST['username'];
    $pword = $_POST['password'];
    include("connection.php");

    if ($_SESSION['login_attempts'] < 3) {
        $query = "SELECT fld_username, fld_password FROM tbl_account WHERE fld_username = '$user' AND fld_password = '$pword'";
        $result = mysqli_query($conn, $query);

        if ($result) {
            if (mysqli_num_rows($result)) {
                // 登录成功,重置尝试次数
                $_SESSION['login_attempts'] = 0;
                echo "<script> alert('You are logged in Successfully!'); window.location = 'profile.php'; </script>";
                exit(); // 确保脚本停止执行
            } else {
                // 登录失败,增加尝试次数
                $_SESSION['login_attempts']++;
                echo '<script> alert("You have invalid username/password and the number of attempt is ' . $_SESSION['login_attempts'] . '"); </script>';
                // 不再重定向,而是刷新当前页面,保持尝试次数
            }
        } else {
            // 查询失败处理
            echo '<script> alert("Database query error."); </script>';
        }
    }

    if ($_SESSION['login_attempts'] >= 3) {
        echo '<script> alert("You have exceeded the maximum number of login attempts!"); window.location = "accountregistration.php"; </script>';
        exit(); // 确保脚本停止执行
    }
}
?>

<html>
<head>
<title>LOGIN</title>
</head>
<body>
<form action="" method="POST">
    <fieldset>
        <legend>Login</legend>
        <label>Username:</label><input type="Text" name="username" id="username"><br><br>
        <label>Password:</label><input type="password" name="password" id="password"><br><br>
        &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp<input name="login" type="submit" value="Login"> &nbsp <input name="clear" type="reset" value="Clear">
    </fieldset>
</form>
</body>
</html>
登录后复制

2. 移除不必要的隐藏字段

原始代码中使用隐藏字段传递尝试次数,这既不安全也不必要。会话已经提供了更好的存储机制。

3. 避免在每次失败后重定向

绘蛙AI修图
绘蛙AI修图

绘蛙平台AI修图工具,支持手脚修复、商品重绘、AI扩图、AI换色

绘蛙AI修图 129
查看详情 绘蛙AI修图

每次登录失败后重定向到index.php会导致会话数据丢失。应该保持在同一页面,并使用会话来跟踪尝试次数。

4. 错误处理

添加了数据库查询失败的错误处理。

5. 安全性考虑

  • 防止SQL注入: 使用预处理语句或参数化查询来防止SQL注入攻击。
  • 密码哈希: 不要以明文形式存储密码。使用password_hash()函数对密码进行哈希处理,并使用password_verify()函数进行验证。
  • 会话安全: 确保会话安全,防止会话劫持。

改进后的代码示例 (包含安全性改进)

<?php
session_start();

// 初始化尝试次数
if (!isset($_SESSION['login_attempts'])) {
    $_SESSION['login_attempts'] = 0;
}

if (isset($_POST['login'])) {
    $user = $_POST['username'];
    $pword = $_POST['password']; //  注意: 生产环境中不要直接使用POST的密码,需要进行哈希验证

    include("connection.php");

    if ($_SESSION['login_attempts'] < 3) {
        // 使用预处理语句防止SQL注入
        $query = "SELECT fld_username, fld_password FROM tbl_account WHERE fld_username = ?";
        $stmt = mysqli_prepare($conn, $query);
        mysqli_stmt_bind_param($stmt, "s", $user);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);

        if ($result) {
            if (mysqli_num_rows($result)) {
                $row = mysqli_fetch_assoc($result);
                // 密码验证 (假设数据库中存储的是哈希后的密码)
                if($pword == $row['fld_password']) { // 生产环境需要使用 password_verify() 函数
                    // 登录成功,重置尝试次数
                    $_SESSION['login_attempts'] = 0;
                    echo "<script> alert('You are logged in Successfully!'); window.location = 'profile.php'; </script>";
                    exit();
                } else {
                    // 密码错误
                    $_SESSION['login_attempts']++;
                    echo '<script> alert("Invalid username/password and the number of attempts is ' . $_SESSION['login_attempts'] . '"); </script>';
                }

            } else {
                // 用户名不存在
                $_SESSION['login_attempts']++;
                echo '<script> alert("Invalid username/password and the number of attempts is ' . $_SESSION['login_attempts'] . '"); </script>';
            }
        } else {
            // 查询失败
            echo '<script> alert("Database query error."); </script>';
        }
    }

    if ($_SESSION['login_attempts'] >= 3) {
        echo '<script> alert("You have exceeded the maximum number of login attempts!"); window.location = "accountregistration.php"; </script>';
        exit();
    }
}
?>

<html>
<head>
<title>LOGIN</title>
</head>
<body>
<form action="" method="POST">
    <fieldset>
        <legend>Login</legend>
        <label>Username:</label><input type="Text" name="username" id="username"><br><br>
        <label>Password:</label><input type="password" name="password" id="password"><br><br>
        &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp<input name="login" type="submit" value="Login"> &nbsp <input name="clear" type="reset" value="Clear">
    </fieldset>
</form>
</body>
</html>
登录后复制

总结

通过使用会话存储登录尝试次数,并避免在每次失败后重定向,可以有效地解决登录尝试计数不准确的问题。此外,还应该注意安全性,防止SQL注入攻击,并使用密码哈希。记住,代码安全是Web开发中至关重要的一环。

以上就是PHP 登录尝试计数失败问题排查与修复教程的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号