菜鸟科技网

搭建网站登录代码

技术栈选择

层级 推荐方案 说明
前端框架 HTML + CSS + JavaScript (原生/Vue/React) 兼容性强且轻量化
后端语言 Python Flask / Node.js Express 快速开发API接口
数据库 MySQL / PostgreSQL 存储用户凭证与元数据
安全机制 JWT令牌认证 + HTTPS 保障传输加密与身份验证

核心代码实现

前端页面 (login.html)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">用户登录</title>
    <style>
        .container { width: 300px; margin: 50px auto; }
        input[type="text"], input[type="password"] { display: block; margin-bottom: 10px; }
        button { padding: 8px 16px; background: #007bff; color: white; border: none; }
    </style>
</head>
<body>
    <div class="container">
        <form id="loginForm">
            <label>用户名: <input type="text" name="username" required></label><br>
            <label>密码: <input type="password" name="password" required></label><br>
            <button type="submit">登录</button>
            <p id="errorMsg" style="color: red;"></p>
        </form>
    </div>
    <script src="/static/js/login.js"></script>
</body>
</html>

前端交互逻辑 (login.js)

document.getElementById('loginForm').addEventListener('submit', async (e) => {
    e.preventDefault(); // 阻止表单默认提交行为
    const formData = new FormData(e.target);
    try {
        const response = await fetch('/api/login', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({...formData})
        });
        if (!response.ok) throw new Error('请求失败');
        const data = await response.json();
        if (data.token) {
            localStorage.setItem('authToken', data.token); // 保存JWT令牌
            window.location.href = '/dashboard'; // 跳转至主页
        } else {
            document.getElementById('errorMsg').textContent = data.message || '登录失败';
        }
    } catch (err) {
        console.error(err);
        document.getElementById('errorMsg').textContent = '网络错误,请重试';
    }
});

后端API接口 (Python Flask示例)

from flask import Flask, request, jsonify
import jwt  # PyJWT库
from datetime import datetime, timedelta
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key-here'  # 生产环境应通过环境变量配置
# 模拟用户数据库查询函数
def verify_user(username, password):
    # 实际项目中替换为真实数据库查询逻辑
    return username == "admin" and password == "123456"
@app.route('/api/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')
    if not verify_user(username, password):
        return jsonify({"message": "无效的用户名或密码"}), 401
    # 生成JWT令牌(有效期1小时)
    token = jwt.encode({
        'sub': username,
        'exp': datetime.utcnow() + timedelta(hours=1)
    }, app.config['SECRET_KEY'], algorithm='HS256')
    return jsonify({"token": token}), 200
if __name__ == '__main__':
    app.run(debug=True)

数据库表结构设计 (MySQL示例)

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL, -存储bcrypt哈希值
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

⚠️ 重要提示:永远不要明文存储密码!必须使用bcrypt等算法进行单向哈希处理,例如在Python中可通过flask_bcrypt扩展实现:

搭建网站登录代码-图1
(图片来源网络,侵删)
from flask_bcrypt import Bcrypt
bcrypt = Bcrypt(app)
hashed_pwd = bcrypt.generate_password_hash(plaintext_password).decode('utf-8')

关键安全措施清单

序号 措施名称 实现方式 作用
1 CSRF防护 使用SameSite=Strict Cookie属性 防止跨站请求伪造攻击
2 XSS过滤 对用户输入进行HTML转义 避免脚本注入
3 暴力破解限制 IP限速+账户锁定策略 抵御字典攻击
4 HTTPS强制启用 Nginx配置SSL证书 加密通信通道
5 CORS白名单管理 设置Access-Control-Allow-Origin头域 控制跨域资源访问范围

常见问题与解答

Q1: 如果用户忘记密码怎么办?

A: 应提供“找回密码”功能流程:

  1. 输入注册邮箱触发重置链接发送;
  2. 点击链接后进入独立页面验证新密码;
  3. 后端生成一次性令牌并校验时效性;
  4. 更新数据库中的密码哈希值。

    ✅ 示例扩展点:可集成邮件服务发送验证码而非直接暴露原密码。

Q2: 如何实现多因素认证(MFA)?

A: 推荐采用TOTP标准方案:

  1. 用户首次绑定时生成随机密钥基数;
  2. 前端调用WebAuthn API或显示二维码供扫码绑定;
  3. 每次登录除密码外还需输入动态验证码(如Google Authenticator生成);
  4. 后端使用pyotp库验证OTP码有效性。

    💡 进阶方案:支持硬件安全钥匙(U2F/FIDO2)作为第二因素认证方式。

    搭建网站登录代码-图2
    (图片来源网络,侵删)

测试用例示例

测试场景 输入参数 预期结果
正确凭证 {"username":"admin","password":"123456"} 返回200状态码及有效JWT
错误用户名 {"username":"unknown","password":"anything"} 返回401未授权错误
SQL注入尝试 {"username":"' OR 1=1--", "password":"dummy"} 被WAF拦截或返回语法错误提示
空字段提交 返回400坏请求错误
超长特殊字符攻击 {"username": "a".repeat(1000), ...} 自动截断或拒绝服务

部署注意事项

  1. 环境隔离:开发/测试/生产环境配置分离(推荐使用Docker Compose管理多容器架构)
  2. 日志审计:记录所有认证相关操作日志(包括失败尝试IP地址)
  3. 性能优化:对高频访问接口添加Redis缓存层减少数据库压力
  4. 灾备方案:定期备份用户数据并测试恢复流程有效性

通过以上方案可实现一个基础但安全的登录系统,后续可根据业务需求扩展OAuth2.0第三方登录

搭建网站登录代码-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇