PHP实现登录密码错误提示信息输出到首页的技术咨询
实现方案
第一步:修改登录校验逻辑,将错误信息存入Session后跳转首页
跨页面传递临时提示信息用Session是最稳妥的方案,你需要把原有代码中直接echo错误提示的逻辑,替换为存错误到Session、再跳转到首页的逻辑:
<?php session_start(); require_once ($_SERVER['DOCUMENT_ROOT']. '/engine/data/main_config.php'); require_once ($_SERVER['DOCUMENT_ROOT']. '/engine/core/mysql_connect.php'); if($_POST['response']) { $captcha = $_POST['response']; $secret = "6LfZjeIbAAAAALhKqTKfXlB14lAbj"; $json = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=". $secret . "&response=" . $captcha), true); if(!$json['success']) { $_SESSION['login_error'] = '校验失败,请重新完成人机验证'; header('Location: /index.php'); // 替换为你实际的首页地址 exit(); } } else { $_SESSION['login_error'] = '请完成人机验证后再提交登录'; header('Location: /index.php'); exit(); } // 此处后续需要改成预处理查询,避免SQL注入,参考下方安全提醒 $result = $mysqli->query("SELECT * FROM dle_users WHERE name LIKE '".$_POST['login']."'"); if ($result->num_rows > 0) { $password_mysql = $mysqli->query("select password from dle_users where name='".$_POST['login']."'")->fetch_object()->password; $realname = $mysqli->query("select name from dle_users where name='".$_POST['login']."'")->fetch_object()->name; if (!password_verify(urldecode($_POST['password']), $password_mysql)) { $_SESSION['login_error'] = '你输入的密码错误,请重试或找回密码'; header('Location: /index.php'); exit(); } else { $_SESSION['login'] = $realname; $_SESSION['password'] = $_POST['password']; // 登录成功后的跳转逻辑自行保留 } } else { $_SESSION['login_error'] = '当前账号不存在'; header('Location: /index.php'); exit(); } include('algo.php'); ?>
第二步:首页添加错误信息展示逻辑
在首页代码最顶部确认已经开启session_start(),之后在你想要显示错误提示的位置加入以下代码:
<?php if (isset($_SESSION['login_error'])): ?> <center> <div class="form-block-error"> <b><?php echo $_SESSION['login_error']; ?></b> </div> </center> <script>grecaptcha.reset();</script> <?php // 展示后立即删除Session中的错误,避免刷新页面重复显示 unset($_SESSION['login_error']); endif; ?>
重要安全提醒
你现有代码存在严重的SQL注入漏洞,直接把用户提交的$_POST['login']拼接进SQL语句,会被攻击者拖库甚至拿到服务器权限,必须改成预处理语句查询,示例:
// 错误写法,禁止使用 // $result = $mysqli->query("SELECT * FROM dle_users WHERE name LIKE '".$_POST['login']."'"); // 正确预处理写法 $stmt = $mysqli->prepare("SELECT password, name FROM dle_users WHERE name = ?"); $stmt->bind_param("s", $_POST['login']); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $user = $result->fetch_object(); $password_mysql = $user->password; $realname = $user->name; // 后续密码校验逻辑不变 }
内容的提问来源于stack exchange,提问作者ND Flying
相关产品推荐
相关产品推荐

