# attack **Repository Path**: livejerry/attack ## Basic Information - **Project Name**: attack - **Description**: 攻防演示 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-18 - **Last Updated**: 2026-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SQL注入攻防演示平台 一个用于教育和学习目的的SQL注入漏洞演示项目,包含不安全版本和安全版本的对比实现。 ## 📋 项目概述 本项目展示了: - ❌ **不安全版本**:存在SQL注入漏洞的实现 - ✅ **安全版本**:采用参数化查询和输入验证的防护实现 ### 技术栈 **后端:** - Go 1.21+ - Gin Web Framework - PostgreSQL 18 - pgx驱动 - godotenv配置管理 **前端:** - React 18 - Vite - Axios ## 🏗️ 项目结构 ``` sql-injection-demo/ ├── backend/ # 后端项目 │ ├── cmd/ │ │ ├── vulnerable/ # 不安全版本入口 │ │ └── secure/ # 安全版本入口 │ ├── internal/ │ │ ├── config/ # 配置管理 │ │ ├── database/ # 数据库连接 │ │ ├── handlers/ # 路由处理器 │ │ └── models/ # 数据模型 │ ├── .env # 环境变量配置 │ ├── go.mod │ └── init.sql # 数据库初始化脚本 ├── frontend/ # 前端项目 │ ├── src/ │ │ ├── components/ # React组件 │ │ ├── services/ # API服务 │ │ ├── App.jsx │ │ └── main.jsx │ ├── package.json │ └── vite.config.js └── README.md ``` ## 🚀 快速开始 ### 前置要求 - Go 1.21+ - Node.js 16+ - PostgreSQL 18 - Git ### 步骤1:设置PostgreSQL数据库 1. 创建数据库和用户: ```bash psql -U postgres ``` ```sql CREATE DATABASE demo_db; CREATE USER demo_user WITH PASSWORD 'demo_password'; GRANT ALL PRIVILEGES ON DATABASE demo_db TO demo_user; \c demo_db GRANT ALL ON SCHEMA public TO demo_user; ``` 2. 初始化数据库表: ```bash cd backend psql -U demo_user -d demo_db -f init.sql ``` ### 步骤2:启动后端服务 #### 不安全版本(端口8080) ```bash cd backend go mod tidy go run cmd/vulnerable/main.go ``` #### 安全版本(端口8081) 打开新终端: ```bash cd backend SERVER_PORT=8081 go run cmd/secure/main.go ``` ### 步骤3:启动前端服务 ```bash cd frontend npm install npm run dev ``` ### 步骤4:访问应用 浏览器打开:http://localhost:5173 ## 🧪 测试SQL注入攻击 ### 不安全版本演示 #### 1. 登录接口注入 ``` 用户名: admin' -- 密码: 任意值 结果: 绕过密码验证,成功登录admin账户 ``` #### 2. 搜索接口UNION注入 ``` 关键词: ' UNION SELECT credit_card, cvv FROM payment_info -- 结果: 窃取支付信息表的敏感数据 ``` #### 3. 用户查询数字型注入 ``` ID: 1 OR 1=1 结果: 获取所有用户信息 ``` ### 安全版本演示 尝试相同的注入攻击: - ✅ 所有恶意输入被拦截 - ✅ 返回友好的错误提示 - ✅ 不泄露数据库错误详情 - ✅ 记录可疑请求到日志 ## 🔒 安全防护措施 ### 1. 参数化查询(Prepared Statement) ```go // ❌ 不安全 query := fmt.Sprintf("SELECT * FROM users WHERE username = '%s'", username) // ✅ 安全 query := "SELECT * FROM users WHERE username = $1" db.QueryRow(query, username) ``` ### 2. 输入验证 ```go // 白名单验证:只允许字母、数字、下划线、中文 func isValidInput(input string) bool { matched, _ := regexp.MatchString(`^[\w\u4e00-\u9fa5]+$`, input) return matched } ``` ### 3. 类型验证 ```go // 确保ID是有效的整数 userID, err := strconv.Atoi(userIDStr) if err != nil { return error } ``` ### 4. 错误处理 ```go // ❌ 不安全:暴露详细错误 c.JSON(500, gin.H{"error": err.Error()}) // ✅ 安全:统一错误提示 c.JSON(500, gin.H{"error": "查询失败,请稍后重试"}) ``` ## 📊 API端点 ### 不安全版本 (http://localhost:8080) - `POST /api/login` - 登录(存在注入漏洞) - `GET /api/search?keyword=xxx` - 搜索(存在UNION注入) - `GET /api/user/:id` - 查询用户(存在数字型注入) ### 安全版本 (http://localhost:8081) - `POST /api/login` - 登录(参数化查询) - `GET /api/search?keyword=xxx` - 搜索(输入验证+参数化) - `GET /api/user/:id` - 查询用户(类型验证+参数化) ## ⚠️ 重要提示 1. **教育目的**:本项目仅用于学习和教育目的 2. **不要用于生产**:不安全版本绝对不要在生产环境中使用 3. **法律责任**:请勿将所学知识用于非法活动 4. **最佳实践**:在实际项目中始终使用安全版本的实现方式 ## 🎓 学习资源 ### OWASP Top 10 - [OWASP Top 10 2021](https://owasp.org/Top10/) - A03:2021 - Injection ### SQL注入防护最佳实践 1. 始终使用参数化查询 2. 实施输入验证和白名单过滤 3. 最小权限原则配置数据库账户 4. 定期安全审计和代码审查 5. 使用ORM框架减少原生SQL ## 🛠️ 故障排除 ### 问题1:数据库连接失败 ```bash # 检查PostgreSQL是否运行 pg_isready # 检查.env配置是否正确 cat backend/.env ``` ### 问题2:Go依赖安装失败 ```bash cd backend go clean -modcache go mod tidy ``` ### 问题3:前端无法连接后端 ```bash # 检查后端是否正常运行 curl http://localhost:8080/api/search?keyword=test curl http://localhost:8081/api/search?keyword=test # 检查vite.config.js代理配置 cat frontend/vite.config.js ``` ## 📝 许可证 MIT License - 仅供教育学习使用 ## 🤝 贡献 欢迎提交Issue和Pull Request来改进这个项目! --- **记住:安全第一!永远不要信任用户输入。** 🔐