feat: 完整项目代码

master
chaol 3 months ago
parent 5b94b9feb1
commit d23ee5348f

@ -0,0 +1,38 @@
#!/usr/bin/env python3
"""
调试后端启动问题
"""
import sys
import os
# 添加项目路径
sys.path.append(os.path.join(os.path.dirname(__file__), 'backend'))
try:
print("1. 测试导入数据库模块...")
from app.database import init_db, get_db
print("✓ 数据库模块导入成功")
print("2. 测试导入模型...")
from app.models import Project, Scan, Vulnerability
print("✓ 模型导入成功")
print("3. 测试导入API路由...")
from app.api import projects, scans, reports, vulnerabilities, files
print("✓ API路由导入成功")
print("4. 测试初始化数据库...")
init_db()
print("✓ 数据库初始化成功")
print("5. 测试创建FastAPI应用...")
from fastapi import FastAPI
app = FastAPI()
print("✓ FastAPI应用创建成功")
print("\n所有测试通过!后端应该可以正常启动。")
except Exception as e:
print(f"❌ 错误: {e}")
import traceback
traceback.print_exc()

File diff suppressed because it is too large Load Diff

@ -0,0 +1,59 @@
# 前端功能实现总结
## 1. 项目仪表板 → 可视化数据展示和统计
- **数据统计卡片**:显示活跃项目数、扫描次数、发现漏洞数、已修复漏洞数
- **趋势分析图表**:漏洞趋势折线图,展示不同严重程度漏洞的时间变化
- **分布分析饼图**:漏洞分类分布(安全、性能、可维护性、可靠性)
- **最近漏洞列表**:展示最新发现的漏洞,支持快速查看详情
## 2. 项目管理 → 项目生命周期管理
- **项目CRUD操作**:创建、编辑、删除项目,支持多编程语言
- **项目信息管理**:项目名称、描述、编程语言、仓库地址、本地路径
- **项目状态跟踪**:创建时间、更新时间等元数据管理
- **快速操作**:一键启动扫描、直接进入代码编辑器
## 3. 扫描管理 → 自动化漏洞检测流程
- **扫描任务创建**:支持全量扫描、增量扫描、自定义扫描
- **扫描进度监控**:实时显示扫描进度条和状态
- **扫描状态管理**:等待中、运行中、已完成、失败、已取消
- **扫描结果查看**支持查看扫描报告和下载PDF报告
## 4. 报告中心 → 漏洞分析和数据导出
- **漏洞列表展示**:支持分页、排序、筛选(严重程度、分类、状态)
- **漏洞详情查看**显示规则ID、描述、文件路径、行号、AI建议
- **智能筛选功能**:按严重程度、分类、状态、关键词搜索
- **数据导出功能**支持Excel、JSON格式导出
- **统计信息展示**:按严重程度统计漏洞数量
## 5. 代码编辑器 → 集成开发环境
- **文件树导航**:项目文件结构展示,支持文件夹展开/收起
- **多语言支持**:根据文件扩展名自动识别编程语言
- **代码编辑功能**:语法高亮、行号显示、代码保存
- **漏洞标记显示**:在代码行侧边栏显示漏洞标记
- **漏洞详情面板**:点击漏洞标记查看详细信息
- **AI修复建议**显示AI生成的修复建议和置信度
- **一键修复功能**应用AI建议并标记漏洞为已修复
## 6. 用户界面设计 → 现代化交互体验
- **响应式布局**:支持侧边栏折叠/展开
- **导航菜单**:仪表板、项目管理、扫描管理、报告中心、代码编辑器
- **状态指示器**:不同颜色标签表示漏洞严重程度和状态
- **交互反馈**:加载状态、成功/错误消息提示
- **数据可视化**:图表展示趋势和分布数据
## 7. API集成 → 前后端数据交互
- **RESTful API调用**:项目、扫描、漏洞、报告相关接口
- **数据状态管理**:组件级别的状态管理和数据同步
- **错误处理**API调用失败的错误处理和用户提示
- **实时数据更新**:支持数据刷新和实时状态同步
## 8. 高级功能 → 智能化特性
- **AI增强分析**漏洞AI置信度显示和智能建议
- **上下文感知**:基于代码上下文的漏洞分析
- **自动修复建议**AI生成的代码修复方案
- **智能筛选**:基于漏洞类型和严重程度的智能推荐
---
**技术栈**React + TypeScript + Ant Design + Chart.js + Axios
**核心特性**可视化数据展示、项目管理、自动化扫描、智能代码编辑、AI增强分析

@ -0,0 +1,164 @@
# Git上传大项目到educoder的解决方案
## 问题分析
您的项目包含以下大文件夹:
- `frontend/node_modules/` (通常几十MB到几百MB)
- `backend/__pycache__/` (Python缓存文件)
- `文档模板:软件需求规格说明书(1).docx` (可能较大)
## 解决方案
### 方案1优化.gitignore + 分批上传
#### 步骤1创建.gitignore文件
```bash
# 已创建.gitignore文件排除不必要的文件
```
#### 步骤2清理已跟踪的大文件
```bash
# 如果已经初始化了git需要清理缓存
git rm -r --cached frontend/node_modules/
git rm -r --cached backend/__pycache__/
git rm --cached "文档模板:软件需求规格说明书(1).docx"
```
#### 步骤3分批提交
```bash
# 第一次提交:核心代码
git add backend/app/ backend/main.py backend/requirements.txt
git commit -m "feat: 添加后端核心代码"
# 第二次提交:前端源码
git add frontend/src/ frontend/public/ frontend/package.json frontend/tsconfig.json
git commit -m "feat: 添加前端源码"
# 第三次提交:配置和文档
git add README.md DEPLOYMENT.md *.bat *.ps1
git commit -m "feat: 添加项目配置和文档"
```
### 方案2使用Git LFS (推荐)
#### 步骤1安装Git LFS
```bash
git lfs install
```
#### 步骤2配置LFS跟踪大文件
```bash
# 跟踪大文档文件
git lfs track "*.docx"
git lfs track "*.pdf"
# 跟踪数据库文件
git lfs track "*.db"
git lfs track "*.sqlite"
```
#### 步骤3正常提交
```bash
git add .gitattributes
git add .
git commit -m "feat: 完整项目代码"
git push origin main
```
### 方案3压缩优化上传
#### 步骤1创建最小化版本
```bash
# 创建临时目录
mkdir temp_upload
cd temp_upload
# 复制核心文件
cp -r ../backend/app .
cp ../backend/main.py .
cp ../backend/requirements.txt .
cp -r ../frontend/src .
cp ../frontend/package.json .
cp ../frontend/tsconfig.json .
cp ../README.md .
```
#### 步骤2创建安装脚本
```bash
# 创建install_dependencies.sh
cat > install_dependencies.sh << 'EOF'
#!/bin/bash
echo "安装Python依赖..."
pip install -r requirements.txt
echo "安装Node.js依赖..."
cd frontend
npm install
cd ..
echo "项目依赖安装完成!"
EOF
```
### 方案4使用Git子模块
#### 步骤1分离前后端
```bash
# 将前端作为子模块
git submodule add <frontend-repo-url> frontend
```
## 推荐执行步骤
1. **立即执行**
```bash
# 1. 初始化git如果还没有
git init
# 2. 添加.gitignore
git add .gitignore
git commit -m "feat: 添加.gitignore文件"
# 3. 清理大文件
git rm -r --cached frontend/node_modules/ 2>/dev/null || true
git rm -r --cached backend/__pycache__/ 2>/dev/null || true
# 4. 分批提交
git add backend/
git commit -m "feat: 后端代码"
git add frontend/src/ frontend/public/ frontend/package.json frontend/tsconfig.json
git commit -m "feat: 前端源码"
git add README.md DEPLOYMENT.md *.bat *.ps1
git commit -m "feat: 项目配置"
# 5. 推送到educoder
git remote add origin <educoder-repo-url>
git push -u origin main
```
2. **在educoder上创建README说明**
```markdown
# 项目安装说明
## 环境要求
- Python 3.8+
- Node.js 14+
## 安装步骤
1. 克隆项目
2. 安装Python依赖`pip install -r backend/requirements.txt`
3. 安装前端依赖:`cd frontend && npm install`
4. 运行项目参考README.md中的启动说明
```
## 注意事项
1. **node_modules** 不应该提交到git应该通过 `npm install` 重新安装
2. **__pycache__** 是Python缓存应该被忽略
3. **大文档文件** 可以考虑使用Git LFS或放在云存储
4. **数据库文件** 如果包含敏感数据,应该使用环境变量配置
## 最终建议
推荐使用**方案1优化.gitignore + 分批上传)**,这是最简单有效的方案。

@ -0,0 +1,8 @@
# 示例配置文件
database_host=localhost
database_port=3306
database_user=admin
database_password=admin123
api_key=sk-1234567890abcdef
debug_mode=true
log_level=debug

@ -0,0 +1,109 @@
#!/usr/bin/env python3
"""
示例Python项目 - 包含一些常见的代码漏洞
"""
import os
import sys
import hashlib
import subprocess
from urllib.request import urlopen
class UserManager:
def __init__(self):
self.users = {}
self.admin_password = "admin123" # 硬编码密码
def create_user(self, username, password):
"""创建用户 - 存在SQL注入风险"""
# 模拟SQL查询 - 未使用参数化查询
query = f"INSERT INTO users (username, password) VALUES ('{username}', '{password}')"
print(f"执行查询: {query}")
# 存储明文密码
self.users[username] = password
return True
def authenticate(self, username, password):
"""用户认证"""
if username in self.users:
# 明文密码比较
return self.users[username] == password
return False
def hash_password(self, password):
"""密码哈希 - 使用弱哈希算法"""
# 使用MD5 - 已被认为不安全
return hashlib.md5(password.encode()).hexdigest()
def read_file(filename):
"""读取文件 - 未处理异常"""
# 未检查文件是否存在
with open(filename, 'r') as f:
return f.read()
def download_file(url):
"""下载文件 - 存在安全风险"""
# 未验证URL格式
response = urlopen(url)
return response.read()
def execute_command(cmd):
"""执行系统命令 - 存在命令注入风险"""
# 直接执行用户输入的命令
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
return result.stdout
def process_user_input(data):
"""处理用户输入 - 未进行输入验证"""
# 未验证输入长度和内容
if len(data) > 1000: # 简单的长度检查
return "输入过长"
# 未过滤危险字符
return data.replace('<script>', '').replace('</script>', '')
def calculate_total(items):
"""计算总数 - 存在除零风险"""
total = 0
for item in items:
# 未检查除零
total += item['price'] / item['quantity']
return total
def main():
"""主函数"""
print("代码漏洞检测系统示例")
# 硬编码的敏感信息
api_key = "sk-1234567890abcdef"
database_url = "mysql://user:password@localhost/db"
# 未使用HTTPS
external_url = "http://api.example.com/data"
# 创建用户管理器
user_mgr = UserManager()
# 模拟用户操作
username = input("请输入用户名: ")
password = input("请输入密码: ")
# 未验证输入
if user_mgr.create_user(username, password):
print("用户创建成功")
# 尝试读取文件
try:
content = read_file("config.txt")
print("配置文件内容:", content)
except:
print("文件读取失败")
# 执行命令
command = input("请输入要执行的命令: ")
output = execute_command(command)
print("命令输出:", output)
if __name__ == "__main__":
main()

@ -0,0 +1,192 @@
"""
工具函数 - 包含更多漏洞示例
"""
import json
import pickle
import base64
import socket
import threading
import time
class DataProcessor:
def __init__(self):
self.cache = {}
self.lock = threading.Lock()
def serialize_data(self, data):
"""序列化数据 - 使用不安全的pickle"""
# pickle存在安全风险可能执行任意代码
return pickle.dumps(data)
def deserialize_data(self, data):
"""反序列化数据 - 使用不安全的pickle"""
return pickle.loads(data)
def base64_encode(self, data):
"""Base64编码"""
return base64.b64encode(data.encode()).decode()
def base64_decode(self, data):
"""Base64解码 - 未处理异常"""
return base64.b64decode(data).decode()
def json_parse(self, json_str):
"""JSON解析 - 未处理异常"""
return json.loads(json_str)
def process_large_file(self, filename):
"""处理大文件 - 可能导致内存溢出"""
# 一次性读取整个文件到内存
with open(filename, 'r') as f:
content = f.read()
# 未限制处理的数据量
lines = content.split('\n')
processed_lines = []
for line in lines:
# 模拟复杂处理
processed_lines.append(line.upper())
return processed_lines
class NetworkManager:
def __init__(self):
self.connections = []
def connect_to_server(self, host, port):
"""连接到服务器 - 未处理异常"""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 未设置超时
sock.connect((host, port))
return sock
def send_data(self, sock, data):
"""发送数据 - 未验证数据"""
# 未检查数据大小
sock.send(data.encode())
def receive_data(self, sock, buffer_size=1024):
"""接收数据 - 缓冲区溢出风险"""
# 固定缓冲区大小可能导致溢出
return sock.recv(buffer_size)
def start_server(self, port):
"""启动服务器 - 未处理异常"""
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', port)) # 绑定到所有接口
server_socket.listen(5)
while True:
client_socket, addr = server_socket.accept()
# 未验证客户端
print(f"连接来自: {addr}")
# 在新线程中处理客户端
client_thread = threading.Thread(
target=self.handle_client,
args=(client_socket,)
)
client_thread.start()
def handle_client(self, client_socket):
"""处理客户端连接 - 未验证输入"""
while True:
data = client_socket.recv(1024)
if not data:
break
# 直接执行接收到的命令
command = data.decode()
if command.startswith('exec:'):
# 命令注入风险
exec(command[5:])
client_socket.send(b"OK")
class FileManager:
def __init__(self):
self.open_files = {}
def read_config(self, filename):
"""读取配置文件 - 路径遍历风险"""
# 未验证文件路径
with open(filename, 'r') as f:
return f.read()
def write_log(self, message):
"""写入日志 - 未检查磁盘空间"""
with open('app.log', 'a') as f:
f.write(f"{time.time()}: {message}\n")
def backup_file(self, source, destination):
"""备份文件 - 未验证路径"""
import shutil
# 未检查目标路径
shutil.copy2(source, destination)
def delete_file(self, filename):
"""删除文件 - 未验证权限"""
import os
# 未检查文件是否存在和权限
os.remove(filename)
def vulnerable_function(data):
"""包含多个漏洞的函数"""
# 1. 未验证输入
if isinstance(data, str):
# 2. 字符串格式化漏洞
query = "SELECT * FROM users WHERE name = '%s'" % data
print(query)
# 3. 未检查异常
try:
result = eval(data) # 使用eval存在代码注入风险
return result
except:
return None
def race_condition_example():
"""竞态条件示例"""
counter = 0
def increment():
nonlocal counter
temp = counter
time.sleep(0.001) # 模拟处理时间
counter = temp + 1
# 创建多个线程同时修改counter
threads = []
for i in range(10):
thread = threading.Thread(target=increment)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print(f"最终计数器值: {counter}") # 可能不是10
if __name__ == "__main__":
# 测试各种漏洞
processor = DataProcessor()
network_mgr = NetworkManager()
file_mgr = FileManager()
# 测试序列化
test_data = {"user": "admin", "password": "secret"}
serialized = processor.serialize_data(test_data)
print("序列化完成")
# 测试网络连接
try:
sock = network_mgr.connect_to_server("example.com", 80)
print("连接成功")
sock.close()
except:
print("连接失败")
# 测试竞态条件
race_condition_example()

@ -0,0 +1,113 @@
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
import requests
import json
import time
# 替换为你的 Deepseek API 地址和密钥
API_URL = "https://api.deepseek.com/v1/chat/completions"
API_KEY = "your_deepseek_api_key_here"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def split_code(code, max_tokens=3000):
"""将大段代码分割成适合 API 调用的块"""
lines = code.splitlines()
chunks = []
current_chunk = []
current_length = 0
for line in lines:
line_length = len(line.encode('utf-8'))
if current_length + line_length > max_tokens:
chunks.append("\n".join(current_chunk))
current_chunk = []
current_length = 0
current_chunk.append(line)
current_length += line_length
if current_chunk:
chunks.append("\n".join(current_chunk))
return chunks
def analyze_code(code_chunk):
"""调用 Deepseek API 分析代码"""
prompt = f"请检查以下代码中的潜在问题,包括语法错误、风格问题、逻辑漏洞等:\n\n{code_chunk}"
data = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是一个专业的代码审查助手。"},
{"role": "user", "content": prompt}
],
"temperature": 0.3
}
try:
response = requests.post(API_URL, headers=HEADERS, json=data)
response.raise_for_status()
result = response.json()
return result['choices'][0]['message']['content']
except Exception as e:
return f"API 调用失败: {str(e)}"
def load_file():
file_path = filedialog.askopenfilename(filetypes=[("Python 文件", "*.py"), ("所有文件", "*.*")])
if file_path:
with open(file_path, 'r', encoding='utf-8') as f:
code_text.delete(1.0, tk.END)
code_text.insert(tk.END, f.read())
def analyze():
code = code_text.get(1.0, tk.END)
if not code.strip():
messagebox.showwarning("警告", "请先加载代码")
return
result_text.delete(1.0, tk.END)
result_text.insert(tk.END, "正在分析代码...\n")
root.update()
chunks = split_code(code)
all_results = []
for i, chunk in enumerate(chunks):
result = analyze_code(chunk)
all_results.append(f"=== 第 {i+1} 段代码分析结果 ===\n{result}\n")
time.sleep(1) # 避免 API 请求过快
result_text.delete(1.0, tk.END)
result_text.insert(tk.END, "\n".join(all_results))
# GUI 构建
root = tk.Tk()
root.title("Deepseek 代码检查器")
frame_top = tk.Frame(root)
frame_top.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
code_label = tk.Label(frame_top, text="代码内容:")
code_label.pack(anchor='w')
code_text = scrolledtext.ScrolledText(frame_top, height=20, width=100)
code_text.pack(fill=tk.BOTH, expand=True)
frame_btn = tk.Frame(root)
frame_btn.pack(pady=5)
load_btn = tk.Button(frame_btn, text="加载代码文件", command=load_file)
load_btn.pack(side=tk.LEFT, padx=5)
analyze_btn = tk.Button(frame_btn, text="开始分析", command=analyze)
analyze_btn.pack(side=tk.LEFT, padx=5)
result_label = tk.Label(root, text="分析结果:")
result_label.pack(anchor='w', padx=10)
result_text = scrolledtext.ScrolledText(root, height=15, width=100)
result_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))
root.mainloop()

@ -0,0 +1,55 @@
#!/usr/bin/env python3
"""
测试API连接
"""
import requests
import json
def test_backend_api():
"""测试后端API"""
base_url = "http://localhost:8000"
try:
# 测试健康检查
print("测试健康检查...")
response = requests.get(f"{base_url}/health")
print(f"健康检查状态: {response.status_code}")
print(f"响应: {response.json()}")
# 测试获取项目列表
print("\n测试获取项目列表...")
response = requests.get(f"{base_url}/api/projects")
print(f"项目列表状态: {response.status_code}")
if response.status_code == 200:
print(f"项目数量: {len(response.json())}")
else:
print(f"错误: {response.text}")
# 测试创建项目
print("\n测试创建项目...")
project_data = {
"name": "测试项目",
"description": "这是一个测试项目",
"language": "python",
"project_path": "C:\\Users\\31576\\Desktop\\新建文件夹\\sample_project"
}
response = requests.post(
f"{base_url}/api/projects",
json=project_data,
headers={"Content-Type": "application/json"}
)
print(f"创建项目状态: {response.status_code}")
if response.status_code == 201:
print("项目创建成功!")
print(f"响应: {response.json()}")
else:
print(f"创建失败: {response.text}")
except requests.exceptions.ConnectionError:
print("无法连接到后端服务,请确保后端正在运行")
except Exception as e:
print(f"测试失败: {e}")
if __name__ == "__main__":
test_backend_api()
Loading…
Cancel
Save