logo
1
0
WeChat Login
✨ 要讲的好多quq

SQL 安全与 ORM 演示项目

TypeScript + MySQL 数据库安全编程教学项目,涵盖 SQL 注入、参数化查询、ORM 框架、事务处理等核心概念。

📚 项目概述

本项目包含多个独立的演示程序,用于教学数据库编程中的安全问题、最佳实践和现代 ORM 框架的使用:

  • 数据生成器:批量生成 10 万条随机学生数据
  • SQL 注入演示:展示 SQL 注入漏洞及攻击方式(⚠️ 仅用于教学)
  • 安全 ORM 演示:使用参数化查询防止 SQL 注入
  • TypeORM 演示:企业级 ORM 框架的使用
  • 事务演示:演示数据库事务的 ACID 特性

🚀 快速开始

前置要求

  • Node.js >= 16
  • MySQL/MariaDB 数据库
  • pnpm(推荐)或 npm

安装依赖

pnpm install # 或 npm install

配置环境变量

在项目根目录创建 .env 文件:

DB_HOST=127.0.0.1 DB_USER=root DB_PASSWORD=你的密码 DB_NAME=LearnDB

初始化数据库

CREATE DATABASE IF NOT EXISTS LearnDB; USE LearnDB; -- 学生表(用于数据生成演示) CREATE TABLE students ( student_id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(100), age INT, major VARCHAR(50), gpa DECIMAL(3,2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 用户表(用于登录和 ORM 演示) CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, email VARCHAR(100) NOT NULL, role VARCHAR(20) DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 账户表(用于事务演示) CREATE TABLE accounts ( id INT PRIMARY KEY AUTO_INCREMENT, account_name VARCHAR(50) UNIQUE NOT NULL, balance DECIMAL(10,2) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

📦 可用命令

1. 生成测试数据

生成 10 万条随机学生数据到 students 表:

pnpm insertData

功能特点

  • 批量插入优化(每批 1000 条)
  • 实时进度显示
  • 生成真实的中文姓名、邮箱、专业、GPA

2. SQL 注入演示

⚠️ 警告:此程序故意包含 SQL 注入漏洞,仅用于教学!

pnpm sql-injection

演示内容

  • 不安全的 SQL 字符串拼接
  • SQL 注入攻击示例(如 admin' OR '1'='1
  • 查看所有用户、删除数据等恶意操作

3. 安全 ORM 演示

使用参数化查询和简单 ORM 模式防止 SQL 注入:

pnpm safe-orm

演示内容

  • 参数化查询(Prepared Statements)
  • 简单的 ORM 封装(Repository 模式)
  • 安全的 CRUD 操作

4. TypeORM 框架演示

使用 TypeORM 企业级 ORM 框架:

pnpm typeorm

演示内容

  • 装饰器定义实体模型
  • Repository API 使用
  • 完全不写 SQL 的开发方式
  • 自动参数化查询

5. 事务演示

演示数据库事务的 ACID 特性:

pnpm transaction

演示内容

  • 转账场景的事务处理
  • 原子性:全部成功或全部回滚
  • 一致性:保持数据完整性
  • 隔离性:事务间不互相干扰
  • 持久性:提交后永久保存

🛠 技术栈

  • TypeScript:类型安全的 JavaScript
  • mysql2:MySQL 客户端驱动
  • TypeORM:企业级 ORM 框架
  • dotenv:环境变量管理
  • reflect-metadata:TypeORM 装饰器支持

📖 学习路径

  1. 初学者:先运行 insertData 了解数据库基本操作
  2. 安全意识:运行 sql-injection 了解 SQL 注入危害
  3. 安全实践:运行 safe-orm 学习防护方法
  4. 框架使用:运行 typeorm 学习现代 ORM
  5. 高级特性:运行 transaction 理解事务机制

⚠️ 安全提示

  • sqlInjection.ts 仅用于教学,切勿用于生产环境
  • 生产环境必须使用参数化查询或 ORM 框架
  • 永远不要信任用户输入
  • 密码应使用哈希加密(bcrypt、scrypt 等)

📝 许可证

MIT |------------|------|-------|-----|-------|-----| | 1 | 李伟强 | user0_a3b2c1@qq.com | 20 | 计算机科学 | 3.75 | | 2 | 王静 | user1_d4e5f6@163.com | 21 | 软件工程 | 3.50 | | 3 | 张明华 | user2_g7h8i9@gmail.com | 19 | 数据科学 | 3.85 |

性能优化

  • 批量插入:每次插入 1000 条记录,减少数据库连接开销
  • 进度显示:实时显示插入进度和速度
  • 错误处理:完善的异常捕获和处理

修改配置

修改数据量

src/index.ts 中修改:

const TOTAL_RECORDS = 50000; // 改为5万条

修改数据库连接

src/index.ts 开头修改:

const DB_CONFIG = { host: 'localhost', user: 'your_username', password: 'your_password', database: 'your_database' };

注意事项

⚠️ 运行前确保

  1. MySQL/MariaDB 服务已启动
  2. 数据库 LearnDB 已创建
  3. students 结构已创建
  4. 数据库用户有足够的权限

⚠️ 数据清理:程序运行时会自动清空 students 表的现有数据(TRUNCATE)

故障排查

连接失败

❌ 数据库连接失败: Error: connect ECONNREFUSED

解决:检查 MySQL 服务是否启动,配置是否正确

表不存在

❌ 插入数据出错: Error: Table 'LearnDB.students' doesn't exist

解决:先执行上述 SQL 创建表

权限不足

❌ Error: Access denied for user

解决:检查数据库用户权限,确保有 INSERT、TRUNCATE 权限

依赖说明

  • mysql2:MySQL 客户端库,支持 Promise
  • typescript:TypeScript 编译器
  • ts-node:直接运行 TypeScript 文件
  • @types/node:Node.js 类型定义

License

MIT