# sql安全检测机器人 **Repository Path**: yzd522/sql-security-detection-robot ## Basic Information - **Project Name**: sql安全检测机器人 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-04-11 - **Last Updated**: 2025-05-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 中国大学生网络安全竞赛 AST 赛道项目知识手册 ## 一、项目概述 本项目围绕 “基于 deepseek - SQL 预警机器人” 展开,致力于构建一个平台,可在自建靶机上模拟并检测 SQL 注入漏洞。通过该平台,能够对任意 URL 进行 SQL 注入点预警及风险等级评估,实现安全的 SQL 注入预览,并利用数据库事务机制保障数据安全。同时,内置权限判断模块,防止平台被用于不法活动。 ## 二、所需工具与技术 ### (一)数据库操作工具 1. **DBeaver** - **功能**:一款图形化数据库管理工具,支持多种数据库,如 MySQL 等。可用于创建数据库、表,执行 SQL 语句,管理数据库数据。 - **使用要点**: - 连接数据库:输入数据库地址(如[localhost](https://localhost))、端口(MySQL 默认 3306)、用户名和密码,建立连接。 - 执行 SQL 语句:在 SQL 编辑器中编写并执行查询、插入、更新、删除等语句。例如,查询语句SELECT * FROM table_name;,插入语句INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2');。 1. **MySQL** - **功能**:常用的关系型数据库管理系统,用于存储项目相关数据,如攻击记录、分析结果等。 - **使用要点**: - 数据库创建:CREATE DATABASE database_name; - 表创建:CREATE TABLE table_name (column1 data_type, column2 data_type, ...); 例如CREATE TABLE attacks (id INT AUTO_INCREMENT PRIMARY KEY, target_url VARCHAR(255), attack_time TIMESTAMP, ...); - **事务处理**:开启事务START TRANSACTION;,在执行可能有风险的 SQL 操作时,需实时监测操作结果。例如在执行INSERT、UPDATE或DELETE语句后,可通过检查rowcount属性(以pymysql为例)来判断操作是否成功。如: ```python import pymysql conn = pymysql.connect(host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME')) cursor = conn.cursor() try: cursor.execute("INSERT INTO some_table (column1, column2) VALUES (%s, %s)", ('value1', 'value2')) if cursor.rowcount != 1: raise Exception("Insert operation did not affect the expected number of rows") conn.commit() except Exception as e: conn.rollback() print(f"Transaction rolled back due to error: {e}") finally: conn.close() ``` 若发现问题,立即使用ROLLBACK;语句回退,确保数据库恢复到操作前的状态。在高并发场景下,为避免事务冲突,可采用乐观锁或悲观锁机制。以乐观锁为例,在表中增加一个版本号字段version,每次更新数据时,先查询当前版本号,更新时带上该版本号并将其加 1,如: ```python import pymysql conn = pymysql.connect(host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME')) cursor = conn.cursor() try: # 先查询数据及版本号 cursor.execute("SELECT data, version FROM some_table WHERE id = %s", (data_id,)) result = cursor.fetchone() if result: current_data, version = result new_data = update_data(current_data) # 假设的更新数据函数 # 尝试更新数据,条件是版本号未变 update_query = "UPDATE some_table SET data = %s, version = version + 1 WHERE id = %s AND version = %s" cursor.execute(update_query, (new_data, data_id, version)) if cursor.rowcount == 1: conn.commit() else: raise Exception("Data has been updated by another process. Please retry.") except Exception as e: conn.rollback() print(f"Transaction rolled back due to error: {e}") finally: conn.close() ``` ### (二)Web 开发框架 1. **Flask** - **功能**:轻量级 Python Web 框架,用于搭建攻击机网站,处理前端请求,调用后端功能模块。 - **使用要点**: - 安装:使用pip install flask进行安装。 - 基本应用创建: ```python from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "Welcome to the SQL injection detection platform" if __name__ == '__main__': app.run(debug=True) ``` - 路由设置:通过@app.route装饰器定义不同的 URL 路由及对应的处理函数。例如@app.route('/detect', methods=['POST'])用于处理检测 SQL 注入的 POST 请求。 - 接收前端数据:在处理函数中通过request对象获取前端发送的数据。如from flask import request,data = request.get_json()获取 JSON 格式数据。 - 返回数据给前端:可以返回字符串、JSON 数据等。例如return jsonify({'result': 'success', 'data': data}),需先导入from flask import jsonify。 - **权限判断模块实现**:在 Flask 的路由处理函数中,可通过检查用户认证信息来判断权限。例如,使用 Flask - Login 扩展实现用户登录认证,在需要权限控制的路由前添加装饰器进行权限检查。首先安装flask - login:pip install flask - login。然后在应用中初始化并配置: ```python from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login' class User(UserMixin): def __init__(self, id): self.id = id # 模拟用户数据库 users = {'admin': User('admin')} @app.route('/login', methods=['GET', 'POST']) def login(): # 处理登录逻辑,验证用户名和密码 username = request.form.get('username') if username in users: user = users[username] login_user(user) return "Login successful" return "Login failed" @app.route('/sensitive_operation') @login_required def sensitive_operation(): # 只有登录用户且有权限才能访问此操作 return "This is a sensitive operation" ``` 在上述代码中,@login_required装饰器确保只有登录用户才能访问sensitive_operation路由对应的操作。实际应用中,可根据具体需求细化权限级别,如管理员权限、普通用户权限等,并在装饰器中进行更复杂的权限判断。对于权限数据的存储,可使用 MySQL 数据库,创建一张权限表permissions,字段包括user_id(关联用户表主键)、permission_name(如 'detect_sql_injection'、'preview_sql_injection' 等)。在权限判断时,从数据库查询用户对应的权限: ```python import pymysql def check_permission(user_id, permission_name): conn = pymysql.connect(host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME')) cursor = conn.cursor() query = "SELECT 1 FROM permissions WHERE user_id = %s AND permission_name = %s" cursor.execute(query, (user_id, permission_name)) result = cursor.fetchone() conn.close() return result is not None ``` 在路由处理函数中调用此函数进行权限验证: ```python @app.route('/preview_injection') @login_required def preview_injection(): user_id = current_user.id # 假设current_user已通过Flask - Login获取 if check_permission(user_id, 'preview_sql_injection'): # 执行预览注入操作 return "Preview injection allowed" return "You do not have permission for this operation" ``` 还可设置用户角色,不同角色对应不同权限集合。创建一张角色表roles,字段有role_id和role_name(如 'admin'、'user'),再创建一张角色权限关联表role_permissions,字段为role_id和permission_name。在权限判断时,先查询用户所属角色,再通过角色查询其拥有的权限。例如: ```python def get_user_roles(user_id): conn = pymysql.connect(host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME')) cursor = conn.cursor() query = "SELECT role_name FROM roles JOIN user_roles ON roles.role_id = user_roles.role_id WHERE user_roles.user_id = %s" cursor.execute(query, (user_id,)) roles = cursor.fetchall() conn.close() return [role[0] for role in roles] def check_permission_by_role(user_id, permission_name): roles = get_user_roles(user_id) conn = pymysql.connect(host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME')) cursor = conn.cursor() for role in roles: query = "SELECT 1 FROM role_permissions WHERE role_name = %s AND permission_name = %s" cursor.execute(query, (role, permission_name)) result = cursor.fetchone() if result: conn.close() return True conn.close() return False ``` 在路由处理函数中可使用check_permission_by_role函数进行更灵活的权限判断。 ### (三)SQL 注入检测工具 1. **sqlmap** - **功能**:强大的自动化 SQL 注入工具,可检测多种类型的 SQL 注入漏洞。 - **使用要点**: - **安装**: - **Linux 系统**:通常可通过包管理器安装,如在基于 Debian 或 Ubuntu 的系统中,可在终端运行sudo apt-get install sqlmap。也可从官方 GitHub 仓库克隆安装,先安装git工具(sudo apt-get install git),然后git clone https://github.com/sqlmapproject/sqlmap.git,进入克隆目录cd sqlmap,运行python3 [sqlmap.py](http://sqlmap.py)即可启动(确保已安装 Python3)。 - **Windows 系统**:从 sqlmap 官方网站下载压缩包,解压后,打开命令提示符,进入解压后的目录,运行python [sqlmap.py](http://sqlmap.py)(需确保 Python 已正确安装且添加到系统环境变量)。 - **命令行使用**: - **基本检测**:检测单个 URL 的 SQL 注入漏洞,命令为sqlmap -u "http://target_url"。这会让 sqlmap 自动尝试多种注入技术来检测目标 URL 是否存在 SQL 注入漏洞。 - **指定注入类型**:例如指定布尔盲注--technique=B。当目标应用对注入尝试的响应没有明显错误信息,但通过不同输入会返回不同页面内容时,布尔盲注可能有用。还有时间盲注--technique=T,适用于应用通过延迟响应时间来暗示注入是否成功的情况;联合查询注入--technique=U,可用于获取数据库更多信息等。 - **提高检测等级**:--level=5,检测等级范围从 1 到 5,等级越高,检测越全面但耗时也可能更长。高等级检测会尝试更多的注入向量和场景。 - **其他常用参数**:--risk=3可设置风险等级(1 - 3 级,3 级风险最高,尝试更多可能破坏数据的测试);--dbs用于列出目标数据库中的所有数据库名称;--tables -D database_name用于列出指定数据库中的所有表;--columns -T table_name -D database_name用于列出指定数据库中指定表的所有列。在复杂网络环境下,若存在代理服务器,可通过--proxy参数设置代理,如sqlmap -u "http://target_url" --proxy "http://proxy_server:port"。若目标网站需要认证,可使用--auth - type参数指定认证类型(如BASIC、DIGEST等),并通过--auth - cred参数提供认证凭证,如sqlmap -u "http://target_url" --auth - type BASIC --auth - cred "username:password"。 - **在 Flask 中调用**:使用 Python 的subprocess模块。 ```python import subprocess result = subprocess.run(['sqlmap', '-u', 'http://target_url'], capture_output=True, text=True) print(result.stdout) ``` 这里subprocess.run函数会运行 sqlmap 命令,capture_output=True表示捕获命令的标准输出和标准错误输出,text=True则将输出以文本形式返回,方便后续处理。在调用 sqlmap 获取到注入点及风险等级相关信息后,可在 Flask 中进一步处理和分析,例如将风险等级映射为具体的描述信息展示给用户: ```python import subprocess result = subprocess.run(['sqlmap', '-u', 'http://target_url', '--risk=3', '--level=5', '--batch'], capture_output=True, text=True) if 'Possible SQL injection' in result.stdout: risk_level = "High" else: risk_level = "Low" # 这里可将risk_level传递给前端展示 ``` 对于 sqlmap 检测结果的解析,可使用正则表达式提取关键信息。例如,提取检测到的数据库类型: ```python import re import subprocess result = subprocess.run(['sqlmap', '-u', 'http://target_url', '--risk=3', '--level=5', '--batch'], capture_output=True, text=True) stdout = result.stdout match = re.search(r'Database type: (\w+)', stdout) if match: db_type = match.group(1) print(f"Detected database type: {db_type}") ``` ### (四)数据分析工具 1. **DeepSeek** - **功能**:用于大规模数据分析,可对收集到的攻击数据进行分析,辅助态势感知。 - **使用要点**: - 安装:按照官方文档进行安装。 - **数据导入与 Flask 集成**:从 MySQL 数据库中获取数据时,需先查询并提取相关数据,再将其整理成适合 DeepSeek 的格式(如 CSV 等)。例如,使用pymysql查询数据库获取攻击频率相关数据: ```python import pymysql conn = pymysql.connect(host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME')) cursor = conn.cursor() cursor.execute("SELECT attack_time, COUNT(*) FROM attacks GROUP BY attack_time") data = cursor.fetchall() conn.close() # 将data转换为适合DeepSeek的格式,如生成CSV文件 import csv with open('attack_frequency.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(['Attack Time', 'Count']) for row in data: writer.writerow(row) ``` 然后在 Flask 中调用 DeepSeek 的分析功能时,需指定输入文件路径。假设 DeepSeek 提供了命令行接口,可通过subprocess调用: ```python import subprocess result = subprocess.run(['deepseek', 'attack_frequency.csv'], capture_output=True, text=True) # 处理DeepSeek的分析结果,将其返回给前端展示 ``` - **分析操作**:根据需求选择合适的分析功能,如统计分析(计算攻击频率、平均值等)、数据挖掘(发现潜在模式)等。DeepSeek 提供多种分析算法,如在进行攻击频率趋势分析时,可选择线性回归算法。在调用 DeepSeek 时,需根据不同算法设置相应参数。假设 DeepSeek 的命令行参数中,--algorithm用于指定算法,--parameters用于传递算法特定参数,对于线性回归分析攻击频率随时间的变化,调用命令可能如下: ```python import subprocess result = subprocess.run(['deepseek', 'attack_frequency.csv', '--algorithm', 'linear_regression', '--parameters', '{"x_column": "Attack Time", "y_column": "Count"}'], capture_output=True, text=True) ``` 在数据导入 DeepSeek 前,往往需要进行数据清洗。例如,检查数据是否存在缺失值,对于攻击时间字段,若存在缺失值,可采用向前填充或向后填充的方式处理。在 Python 中,使用pandas库进行数据清洗: ```python import pandas as pd data = pd.read_csv('attack_frequency.csv') data.fillna(method='ffill', inplace=True) data.to_csv('cleaned_attack_frequency.csv', index=False) ``` 若 DeepSeek 支持模型训练,如构建预测 SQL 注入风险的模型,以攻击频率、攻击类型等作为特征,风险等级作为标签,可使用其内置的机器学习算法进行训练。假设 DeepSeek 提供了训练接口,使用逻辑回归模型训练示例如下: ```python import subprocess parameters = '{"features": ["attack_frequency", "attack_type"], "label": "risk_level", "algorithm": "logistic_regression"}' result = subprocess.run(['deepseek', 'attack_data.csv', '--train', '--parameters', parameters], capture_output=True, text=True) ``` 将分析结果以直观的数据图表形式展示在前端页面上,利用 Chart.js 库实现。例如,若 DeepSeek 分析结果为不同时间段的攻击频率数据,可在前端 HTML 页面中创建相应图表: ```html ``` 对于 Chart.js 图表样式定制,可修改options中的属性。如设置图表标题,添加如下代码: ```javascript options: { scales: { y: { beginAtZero: true } }, title: { display: true, text: 'Attack Frequency by Day' } } ``` 实现交互功能,如当用户鼠标悬停在图表柱子上显示详细数据,可使用Chart.js的tooltips选项: ```javascript options: { scales: { y: { beginAtZero: true } }, title: { display: true, text: 'Attack Frequency by Day' }, tooltips: { mode: 'index', intersect: false, callbacks: { label: function(tooltipItem, data) { let label = data.datasets[tooltipItem.datasetIndex].label || ''; if (label) { label += ': '; } label += data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; return label; } } } } ``` 为实现图表动态更新,当有新的攻击数据添加到数据库并经 DeepSeek 分析后,可通过 AJAX 请求从后端获取最新数据并更新图表。在 JavaScript 中: ```javascript function updateChart() { $.ajax({ url: '/get_latest_attack_data', method: 'GET', success: function(data) { let chart = document.getElementById('attackFrequencyChart').getContext('2d'); let myChart = new Chart(chart, { type: 'bar', data: data, options: { scales: { y: { beginAtZero: true } } } }); } }); } // 定时调用更新函数,如每5分钟更新一次 setInterval(updateChart, 5 * 60 * 1000); ``` 若需实现多图表联动,例如一个图表展示攻击频率,另一个图表展示风险等级分布,当用户点击攻击频率图表中某一天的数据时,风险等级分布图表突出显示该天对应的风险等级数据。可通过为图表添加点击事件监听器,在事件处理函数中通过 AJAX 请求获取相关数据并更新另一个图表: ```javascript let attackChart = document.getElementById('attackFrequencyChart').getContext('2d'); let myAttackChart = new Chart(attackChart, { type: 'bar', data: attackData, options: { scales: { y: { beginAtZero: true } }, onClick: function(event, elements) { if (elements.length > 0) { let clickedIndex = elements[0].index; let clickedDay = attackData.labels[clickedIndex]; $.ajax({ url: '/get_risk_distribution', method: 'POST', data: {day: clickedDay}, success: function(data) { let riskChart = document.getElementById('riskDistributionChart').getContext('2d'); let myRiskChart = new Chart(riskChart, { type: 'pie', data: data, options: {} }); } }); } } } }); ``` ### (五)页面设计框架与图表库 1. **Bootstrap 框架使用** - **引入框架**:在 HTML 文件的标签内,通过 CDN 链接引入 Bootstrap 的 CSS 和 JavaScript 文件。 ```html ``` - **使用组件**: - **表单组件**:创建一个用于输入目标 URL 的表单,代码如下: ```html
``` 这里mb - 3类用于设置元素底部外边距,form - label和form - control类分别用于美化标签和输入框样式,btn和btn - primary类定义按钮样式。 - **导航栏组件**:若要创建一个导航栏,代码如下: ```html ``` 此代码创建了一个响应式导航栏,包含品牌名称、切换按钮和导航链接。 2. **Tailwind 框架使用** - **安装与设置**: - **使用 CDN**:在 HTML 文件标签内添加 Tailwind CSS 的 CDN 链接,如下: ```html ``` - **本地安装(适用于更复杂项目)**:若使用 npm(Node Package Manager),先确保已安装 Node.js,然后在项目目录下运行npm install tailwindcss,接着通过npx tailwindcss init生成配置文件tailwind.config.js,可根据需求自定义配置。 - **应用样式**: - **按钮样式**:创建一个按钮,代码如下: ```html ``` 这里bg - blue - 500设置按钮背景颜色,hover:bg - blue - 700设置鼠标悬停时的背景颜色,text - white设置文字颜色,font - bold使文字加粗,py - 2 px - 4设置按钮内边距,rounded使按钮边角圆润。 - **网格布局**:使用 Tailwind 的网格系统创建一个简单的两列布局,代码如下: ```html
Column 1
Column 2
``` grid类启用网格布局,grid - cols - 2将容器分为两列,gap - 4设置列之间的间距,bg - gray - 200和p - 4分别设置背景颜色和内边距。 3. **Chart.js 库进行数据图表展示** - 上述已详细介绍在前端页面中使用 Chart.js 创建、定制和实现交互及动态更新图表的方法,从简单的图表初始化,到样式调整、交互功能添加以及动态数据更新和多图表联动,可根据项目需求灵活运用这些技术,将 DeepSeek 的分析结果以更直观、用户友好的方式呈现给平台使用者。 ## 三、项目实施步骤 ### (一)靶机搭建 1. **选择 Web 框架**:可使用 Django 或 Flask 搭建靶机网站。若熟悉 Flask,可按照上述 Flask 使用要点创建基础应用。 1. **设置 SQL 注入点**:在靶机网站的代码中故意设置一些常见的 SQL 注入点,如在处理用户输入时未进行严格过滤。例如,在 Python 代码中使用字符串拼接的方式构造 SQL 语句: ```python username = request.form.get('username') query = "SELECT * FROM users WHERE username = '" + username + "'" ``` 1. **日志记录**:在靶机上记录攻击相关日志,包括攻击时间、攻击来源 IP、攻击的 URL 等信息。可使用 Python 的日志模块logging进行记录。 ```python import logging logging.basicConfig(filename='attacks.log', level=logging.INFO) logging.info('IP: %s, URL: %s, Time: %s', request.remote_addr, request.url, datetime.now()) ``` 同时,为确保日志安全,可定期对日志文件进行备份,并设置合理的文件权限,防止日志被非法篡改。例如,在 Linux 系统中,使用crontab定时任务每周日凌晨备份日志文件: ``` 0 0 * * 0 cp attacks.log attacks.log_backup_$(date +\%Y\%m\%d) ``` 并设置日志文件权限,只允许所有者读写: ``` chmod 600 attacks.log ``` ### (二)攻击机网站开发 1. **前端页面设计**:使用 HTML、CSS 和 JavaScript 进行前端页面设计。可参考 Bootstrap 框架,利用其现成的模板和组件快速搭建界面。例如,使用 Bootstrap 的表单组件设计输入目标 URL 的表单,按钮组件触发检测操作。也可选择 Tailwind 框架,按照上述使用方法进行页面布局和样式设计。在前端页面中,为提升用户体验,可添加加载动画。当用户点击检测按钮后,显示加载动画,直到后端处理完成并返回结果。使用 CSS 动画结合 JavaScript 实现,如: ```HTML ``` 此外,为增强用户输入的友好性,可对目标 URL 输入框添加实时验证功能。当用户输入时,检查输入内容是否符合 URL 格式。使用 JavaScript 的正则表达式实现: ```HTML ``` 若输入不符合 URL 格式,输入框将显示红色边框提示用户。 1. **Flask 后端开发**: - 按照上述 Flask 使用要点设置路由,处理前端请求。在处理请求时,增加错误处理机制。例如,当调用 sqlmap 出现异常时,捕获异常并返回给前端友好的错误提示。 ```python from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/detect', methods=['POST']) def detect_sql_injection(): try: target_url = request.json.get('target_url') if not target_url: raise ValueError("Target URL is missing") result = subprocess.run(['sqlmap', '-u', target_url], capture_output=True, text=True) if result.returncode != 0: raise Exception("sqlmap execution failed") return jsonify({'result': result.stdout}) except ValueError as ve: return jsonify({'error': str(ve)}), 400 except Exception as e: return jsonify({'error': "An error occurred during SQL injection detection: " + str(e)}), 500 ``` - 实现调用 sqlmap 检测 SQL 注入功能,将检测结果返回给前端。在获取 sqlmap 检测结果后,对结果进行解析和整理,以更清晰的格式返回给前端。例如,提取检测到的注入点和风险等级: ```python import re @app.route('/detect', methods=['POST']) def detect_sql_injection(): try: target_url = request.json.get('target_url') if not target_url: raise ValueError("Target URL is missing") result = subprocess.run(['sqlmap', '-u', target_url], capture_output=True, text=True) if result.returncode != 0: raise Exception("sqlmap execution failed") output = result.stdout injection_points = re.findall(r'Parameter: (\w+)', output) risk_levels = re.findall(r'Risk: (\d+)', output) return jsonify({'injection_points': injection_points, 'risk_levels': risk_levels}) except ValueError as ve: return jsonify({'error': str(ve)}), 400 except Exception as e: return jsonify({'error': "An error occurred during SQL injection detection: " + str(e)}), 500 ``` - 实现从靶机获取日志数据,并将其存储到 MySQL 数据库中。在存储日志数据时,对数据进行验证,确保数据的准确性和完整性。例如,验证 IP 地址是否合法: ```python import pymysql import ipaddress def validate_ip(ip): try: ipaddress.ip_address(ip) return True except ValueError: return False conn = pymysql.connect(host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME')) cursor = conn.cursor() with open('attacks.log', 'r') as f: for line in f: data = line.strip().split(',') ip = data[0].split(': ')[1] url = data[1].split(': ')[1] time = data[2].split(': ')[1] if not validate_ip(ip): continue query = "INSERT INTO attacks (ip, url, attack_time) VALUES (%s, %s, %s)" cursor.execute(query, (ip, url, time)) conn.commit() conn.close() ``` 为提高后端性能,可对频繁调用的数据库操作进行缓存。例如,使用Flask - Caching扩展对查询攻击频率的操作进行缓存。首先安装Flask - Caching:pip install Flask - Caching。然后在 Flask 应用中配置和使用: ```python from flask_caching import Cache cache = Cache(app, config={'CACHE_TYPE':'simple'}) @cache.cached(timeout=3600) def get_attack_frequency(): conn = pymysql.connect(host=os.getenv('DB_HOST'), user=os.getenv('DB_USER'), password=os.getenv('DB_PASSWORD'), database=os.getenv('DB_NAME')) cursor = conn.cursor() cursor.execute("SELECT attack_time, COUNT(*) FROM attacks GROUP BY attack_time") data = cursor.fetchall() conn.close() return data ``` 1. **集成 DeepSeek 进行数据分析**:将从数据库中获取的数据导入 DeepSeek 进行分析,根据分析结果展示攻击频率、风险等级等信息。可在 Flask 中调用 DeepSeek 的分析功能,并将结果返回给前端展示。当获取到 DeepSeek 的分析结果后,根据不同的分析类型进行处理。例如,若分析结果是攻击频率趋势图数据,直接传递给前端用于更新图表;若分析结果是风险等级预测模型的评估指标,进行格式化处理后展示。 ```python @app.route('/get_deepseek_analysis', methods=['GET']) def get_deepseek_analysis(): try: # 假设这里通过subprocess调用DeepSeek并获取结果 result = subprocess.run(['deepseek', 'attack_data.csv'], capture_output=True, text=True) analysis_type = determine_analysis_type(result.stdout) # 假设此函数判断分析类型 if analysis_type == 'attack_frequency_trend': data = parse_attack_frequency_trend(result.stdout) # 假设此函数解析攻击频率趋势数据 return jsonify({'type': 'attack_frequency_trend', 'data': data}) elif analysis_type == 'risk_model_evaluation': metrics = parse_risk_model_evaluation(result.stdout) # 假设此函数解析风险模型评估指标 formatted_metrics = format_metrics(metrics) # 假设此函数格式化指标 return jsonify({'type': 'risk_model_evaluation', 'metrics': formatted_metrics}) else: return jsonify({'error': "Unrecognized analysis type"}), 400 except Exception as e: return jsonify({'error': "An error occurred during DeepSeek analysis: " + str(e)}), 500 ``` 同时,利用 Chart.js 库,按照上述方法将 DeepSeek 分析结果以直观的数据图表形式展示在前端页面上。在前端接收 DeepSeek 分析结果数据时,根据数据类型调用相应的 Chart.js 图表生成函数。例如: ```js $.ajax({ url: '/get_deepseek_analysis', method: 'GET', success: function(data) { if (data.type === 'attack_frequency_trend') { let chart = document.getElementById('attackFrequencyChart').getContext('2d'); let myChart = new Chart(chart, { type: 'line', data: data.data, options: { scales: { y: { beginAtZero: true } } } }); } else if (data.type === 'risk_model_evaluation') { // 假设这里根据评估指标生成一个表格展示在前端 let metrics = data.metrics; let table = document.createElement('table'); for (let metric in metrics) { let row = document.createElement('tr'); let keyCell = document.createElement('td'); keyCell.textContent = metric; let valueCell = document.createElement('td'); valueCell.textContent = metrics[metric]; row.appendChild(keyCell); row.appendChild(valueCell); table.appendChild(row); } document.getElementById('riskModelMetrics').appendChild(table); } } }); ``` ### (三)整体测试与优化 1. **功能测试**:模拟不同的输入场景,测试攻击机网站能否正确检测 SQL 注入漏洞,能否准确收集攻击信息,DeepSeek 分析结果是否准确。使用单元测试框架,如 Python 的unittest对 Flask 后端函数进行测试。例如,测试detect_sql_injection函数: ```python import unittest from app import detect_sql_injection # 假设app是Flask应用模块 class TestSQLInjectionDetection(unittest.TestCase): def test_missing_target_url(self): result = detect_sql_injection({'target_url': None}) self.assertEqual(result.status_code, 400) self.assertEqual(result.json['error'], "Target URL is missing") def test_successful_detection(self): # 模拟一个成功的sqlmap检测结果 with unittest.mock.patch('subprocess.run') as mock_run: mock_result = unittest.mock.Mock() mock_result.returncode = 0 mock_result.stdout = "Some valid sqlmap output" mock_run.return_value = mock_result result = detect_sql_injection({'target_url': 'http://example.com'}) self.assertEqual(result.status_code, 200) self.assertEqual(result.json['result'], "Some valid sqlmap output") if __name__ == '__main__': unittest.main() ``` 1. **性能优化**:检查代码是否存在性能瓶颈,如数据库查询是否高效,前端页面加载速度是否过慢等。优化数据库查询语句,合理使用缓存等。对于数据库查询,使用索引来提高查询效率。例如,在 MySQL 中,为attacks表的attack_time字段添加索引: ```sql CREATE INDEX idx_attack_time ON attacks (attack_time); ``` 在前端,压缩 CSS 和 JavaScript 文件,减少文件大小,提高页面加载速度。可使用工具如UglifyJS压缩 JavaScript 文件,使用cssnano压缩 CSS 文件。 3. **界面优化**:调整前端页面布局,使其更美观、易用。确保在不同设备和浏览器上的兼容性。使用 CSS 的媒体查询,根据设备屏幕宽度调整页面布局。例如,当屏幕宽度小于 768px 时,将导航栏改为垂直布局: ```css @media (max - width: 768px) { .navbar - nav { flex - direction: column; } } ``` 同时,对页面元素的颜色、字体等进行统一设计,提高页面的整体美观度。