您现在的位置是:知识 >>正文

php登陆页面完整代码

知识488人已围观

简介登录页面不是只有表单和按钮。真正写起来,最容易被忽略的是错误处理——比如用户提交空密码,或者数据库查不到这个人。下面这份代码我用了好几年,改过几轮,现在算是比较稳的版本。 先看目录结构:login.p ...

登录页面不是陆页只有表单和按钮。真正写起来,面完码最容易被忽略的整代是错误处理——比如用户提交空密码,或者数据库查不到这个人。陆页下面这份代码我用了好几年,面完码改过几轮,整代现在算是陆页比较稳的版本。

先看目录结构:login.php 负责显示和验证,面完码config.php 放数据库连接,整代style.css 管外观。陆页这样拆开,面完码以后换数据库或改样式不用动逻辑。整代

config.php 很简单,陆页但别把密码硬编码在里面。面完码我习惯用环境变量,整代没有的话给个默认值:

<?php $host = getenv('DB_HOST') ?: 'localhost'; $db = getenv('DB_NAME') ?: 'test_db'; $user = getenv('DB_USER') ?: 'root'; $pass = getenv('DB_PASS') ?: ''; $charset = 'utf8mb4'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try {  $pdo = new PDO($dsn, $user, $pass, $options); } catch (PDOException $e) {  die('数据库连接失败:' . $e->getMessage()); } ?> 

注意 PDO::ATTR_EMULATE_PREPARES 设为 false,这样预处理语句才是真的预处理,不是拼字符串。很多注入漏洞就出在这。

login.php 分两段:先处理 POST,再渲染 HTML。处理逻辑放最上面,避免“headers already sent”错误。

<?php session_start(); require 'config.php'; $error = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') {  $username = trim($_POST['username'] ?? ''); $password = $_POST['password'] ?? ''; if ($username === '' || $password === '') {  $error = '用户名和密码都不能为空'; } else {  $stmt = $pdo->prepare('SELECT id, password_hash FROM users WHERE username = ? LIMIT 1'); $stmt->execute([$username]); $user = $stmt->fetch(); if ($user && password_verify($password, $user['password_hash'])) {  session_regenerate_id(true); $_SESSION['user_id'] = $user['id']; header('Location: dashboard.php'); exit; } else {  $error = '用户名或密码错误'; } } } ?> 

几个细节:trim() 去掉用户名两边的空格,但密码不能 trim,因为空格可能是密码的一部分。session_regenerate_id(true) 防止会话固定攻击。登录成功后跳转,不要直接输出内容,否则刷新会重复提交。

下面是 HTML 部分,和 PHP 混在一起,但保持干净:

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>登录</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="login-box"> <h1>登录</h1> <?php if ($error): ?> <p class="error"><?= htmlspecialchars($error) ?></p> <?php endif; ?> <form method="post" action=""> <label for="username">用户名</label> <input type="text" id="username" name="username" required autofocus> <label for="password">密码</label> <input type="password" id="password" name="password" required> <button type="submit">登录</button> </form> </div> </body> </html> 

htmlspecialchars($error) 不能省,万一错误信息里带了用户输入,会变成 XSS 漏洞。表单的 action 留空,提交到当前页面,这样不用维护两个文件。

style.css 就简单写几行,够用就行:

body {  font-family: system-ui, sans-serif; background: #f2f2f2; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; } .login-box {  background: #fff; padding: 2rem; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); width: 320px; } .login-box h1 {  margin: 0 0 1.5rem; font-size: 1.5rem; } .login-box label {  display: block; margin-bottom: 0.25rem; font-size: 0.9rem; } .login-box input {  width: 100%; padding: 0.5rem; margin-bottom: 1rem; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } .login-box button {  width: 100%; padding: 0.6rem; background: #0066cc; color: #fff; border: none; border-radius: 4px; cursor: pointer; } .login-box button:hover {  background: #0055aa; } .error {  color: #cc0000; font-size: 0.9rem; margin-bottom: 1rem; } 

数据库表结构别忘了建:

CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL ); 

插入测试用户时,用 password_hash('你的密码', PASSWORD_DEFAULT) 生成哈希,别存明文。我见过有人直接存 md5,那跟没加密差不多。

最后提一句:这个登录页面没有验证码、没有登录失败次数限制,生产环境得加上。但作为基础骨架,它已经避开了最常见的几个坑——SQL 注入、XSS、会话固定。剩下的按需扩展就行。

Tags:

相关文章

  • webpack下载安装

    知识

    webpack的安装比大多数人想象中要简单,但也比很多人期望的要复杂。说它简单,是因为核心步骤就两条命令;说它复杂,是因为你总会在版本冲突和环境变量上栽跟头。 先装Node.js,这是前提。webpa ...

    【知识】

    阅读更多
  • 胶囊计划之荧惑归途电影免费

    知识

    《胶囊计划之荧惑归途》这片子,网上搜“免费”二字,跳出来的链接十有八九是挂羊头卖狗肉。我点了三个,两个是赌博广告页,一个直接给我弹了个“恭喜中奖”的假苹果手机。气得我关掉浏览器,转头去翻B站——正版就 ...

    【知识】

    阅读更多
  • 司法建议重在堵制度漏洞 补治理短板

    知识

    某地法院向一家金融机构发出司法建议,指出其信贷审批系统存在严重漏洞——客户经理可以绕过风控模块,用临时权限给关联企业放款。三个月后,这家机构内部审计发现,类似的违规操作竟然发生过十七次,而此前从未被系 ...

    【知识】

    阅读更多


友情链接