【深度学习】网络安全,SQL注入识别,SQL注入检测,基于深度学习的sql注入语句识别,数据集,代码

文章目录

  • 一、 什么是sql注入
  • 二、 sql注入的例子
  • 三、 深度学习模型
    • 3.1. SQL注入识别任务
    • 3.2. 使用全连接神经网络来做分类
    • 3.3. 使用bert来做sql语句分类
  • 四、 深度学习模型的算法推理和部署
  • 五、代码获取

一、 什么是sql注入

SQL注入是一种常见的网络安全漏洞,它允许攻击者通过向应用程序的输入字段插入恶意SQL代码来执行未经授权的数据库操作。这种攻击通常发生在使用SQL数据库的网站或应用程序中。攻击者可以利用这个漏洞来获取敏感数据、修改数据、甚至完全控制数据库。

SQL注入的原理是利用应用程序在处理用户输入时未正确过滤或转义数据的漏洞。通过在输入字段中插入SQL代码片段,攻击者可以改变SQL查询的逻辑,从而执行意外的数据库操作。这种攻击可能会导致严重的安全问题,包括数据泄露、数据损坏和系统崩溃。

为了防止SQL注入攻击,开发人员应该使用参数化查询或预编译语句等安全的数据库访问方法,并对用户输入进行适当的验证和过滤。另外,定期对应用程序进行安全审计和漏洞扫描也是很重要的。

二、 sql注入的例子

在这个数据集中,第一列就是sql语句,Label列是1就表示这个sql语句是非正常的sql注入:

在这里插入图片描述

Label列是0就表示这个sql语句是正常的sql语句:

在这里插入图片描述

三、 深度学习模型

3.1. SQL注入识别任务

任务目标:输入sql字符串,模型判断出是正常sql语句还是不正常的sql语句。是个分类问题。

3.2. 使用全连接神经网络来做分类

这是部分代码:


# 使用 TF-IDF 权重来转换文本特征为数值特征
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(X_text)# 对标签进行编码和one-hot编码
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)
onehot_encoder = OneHotEncoder(sparse_output=False)
y_onehot = onehot_encoder.fit_transform(y_encoded.reshape(-1, 1))# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.3, random_state=42)# 转换为PyTorch张量
X_train_tensor = torch.tensor(X_train.toarray(), dtype=torch.float32)
X_test_tensor = torch.tensor(X_test.toarray(), dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.float32)# 定义神经网络模型
class Net(nn.Module):def __init__(self, input_size, output_size):super(Net, self).__init__()self.fc1 = nn.Linear(input_size, 128)self.fc2 = nn.Linear(128, 64)self.fc3 = nn.Linear(64, output_size)self.dropout = nn.Dropout(0.5)self.init_weights()def forward(self, x):x = torch.relu(self.fc1(x))x = self.dropout(x)x = torch.relu(self.fc2(x))x = self.dropout(x)x = self.fc3(x)return x# 初始化参数,kaiming初始化def init_weights(self):for m in self.modules():if type(m) == nn.Linear:nn.init.kaiming_normal_(m.weight)m.bias.data.fill_(0.01)

全连接神经网络来做分类在这个任务中是不可以的,原因是会过拟合,一开始的TfidfVectorizer不可取,下面是指标图和损失变化图,可以看出,这个模型是不行的。

在这里插入图片描述
在这里插入图片描述

3.3. 使用bert来做sql语句分类

这是部分代码:


tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=len(label_encoder.classes_))
model.to(device)# 设置优化器和学习率调度器
optimizer = AdamW(model.parameters(), lr=4e-6)
total_steps = len(train_loader) * 20  # 5 个周期
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps)# 初始化指标存储字典
metrics_dict = {'accuracy': [], 'recall': [], 'f1_score': [], 'loss': []}# 训练模型
model.train()
for epoch in range(20):  # 5 个周期total_loss = 0for batch in tqdm(train_loader, desc=f"Epoch {epoch + 1}", unit="batch"):input_ids, attention_mask, labels = tuple(t.to(device) for t in batch)optimizer.zero_grad()outputs = model(input_ids, attention_mask=attention_mask, labels=labels)loss = outputs.losstotal_loss += loss.item()loss.backward()optimizer.step()scheduler.step()

bert是可取的方法,相当于做字符串的分类,下面是bert的训练结果:

在这里插入图片描述

在这里插入图片描述

四、 深度学习模型的算法推理和部署

模型训练后保存为模型文件,部署就是直接用训练好的模型文件进行算法服务。

深度学习模型的算法推理指的是使用预训练的BERT模型对输入的SQL查询进行分类预测,判断其是否存在SQL注入的风险。下面我来解释一下代码中的主要步骤以及如何进行算法推理:

  1. 加载预训练模型和tokenizer:

    • 使用BertTokenizer.from_pretrained加载预训练的BERT模型的tokenizer,用于将输入的文本编码为模型可以理解的格式。
    • 使用BertForSequenceClassification.from_pretrained加载预训练的BERT模型,这是一个针对文本分类任务进行微调的模型。
  2. 定义预测函数predict

    • 输入参数为需要进行分类预测的文本字符串。
    • 使用tokenizer对输入文本进行编码,并确保与训练时使用的最大长度一致。
    • 将编码后的文本数据移动到模型所在的设备(GPU或CPU)。
    • 使用model进行预测,并获取预测结果的类别和概率。
    • 将预测结果格式化为易于理解的字符串形式,并返回包含预测结果和每个类别概率的字典。
  3. 示例使用模型进行预测:

    • 给定一个SQL查询文本作为输入,调用predict函数进行分类预测。
    • 打印输出预测结果,包括预测的类别和其对应的概率。

在这个过程中,模型的算法推理是指模型根据输入的文本数据,利用预训练好的权重和网络结构,计算出对应的预测结果。

结合gradio和fatapi,可以开启web界面和接口,运行代码后,web界面如下,可以输入一个sql字符串,然后模型判断这个字符串的类别:

在这里插入图片描述

接口访问也是可以的,比如这样访问算法服务接口:

import requestsurl = "http://127.0.0.1:7860/predict"  # 确保这与您的FastAPI服务地址匹配# 准备请求的数据
data = {"text": "SELECT * FROM porch FETCH FIRST 50 PERCENT ROWS ONLY"
}
# 发送POST请求
response = requests.post(url, json=data)# 处理响应
if response.status_code == 200:result = response.json()print("预测结果:", result)
else:print(f"请求失败,状态码:{response.status_code}, 错误信息:{response.text}")

五、代码获取

这里获取:

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

代码内容如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【进程间通信】共享内存

文章目录 共享内存常用的接口指令利用命名管道实现同步机制总结 System V的IPC资源的生命周期都是随内核的。 共享内存 共享内存也是为了进程间进行通信的,因为进程间具有独立性,通信的本质是两个不同的进程看到同一份公共资源,所以共享内存…

记录些大模型题集(2)

请简述Transformer基本原理Transformer模型是基于自注意力机制的深度学习模型,主要应用于自然语言处理领域。其基本原理可以概括为以下几个核心组成部分: 自注意力机制(Self-Attention Mechanism)自注意力机制是Transformer的核心概念,它允许模型在进行编码时能够考虑到输…

Java 11 到 Java 8 的兼容性转换

Java 11 到 Java 8 的兼容性转换 欲倚绿窗伴卿卿,颇悔今生误道行。有心持钵丛林去,又负美人一片情。 静坐修观法眼开,祈求三宝降灵台,观中诸圣何曾见?不请情人却自来。 入山投谒得道僧,求教上师说因明。争奈…

Spring Bean的线程安全问题

对于Proptotype(原型)作用域 普通成员变量是否线程安全。 安全 静态变量线程是否安全。 不安全 对于singletion(单例)作用域 普通成员变量是否线程安全。 不安全 静态变量线程是否安全。 不安全 如何解决 对于单例模式&…

WordPress MasterStudy LMS插件 SQL注入漏洞复现(CVE-2024-1512)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin MasterStudy LMS 3.2.5 版本及之…

java项目之在线课程管理系统源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线课程管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 在线课程管理系统的主要…

Nginx配置/.well-known/pki-validation/

当你需要在Nginx上配置.well-known/pki-validation/时,这通常是为了支持SSL证书的自动续订或其他验证目的。以下是配置步骤: 创建目录结构: 在你的网站根目录下创建一个名为.well-known的目录(SSL证书申请之如何创建/.well-known/…

Linux环境Redis部署

Redis部署 Redis是一个高性能的开源键值存储系统,它主要基于内存操作,但也支持数据的持久化。与其他数据库相比,Redis的主要优势在于它的高性能、丰富的数据结构和原生的持久化能力。Redis不仅提供了类似的功能,还增加了持久化和…

如何实现本地缓存

什么是本地缓存 本地缓存是一种数据存储技术,它将数据暂时存储在本地的物理内存(如RAM)或者其他快速访问的存储介质中,以便快速检索,减少对远程数据源(如数据库或外部API)的访问需求。这种技术能…

[初阶数据结构】单链表

前言 📚作者简介:爱编程的小马,正在学习C/C,Linux及MySQL。 📚本文收录于初阶数据结构系列,本专栏主要是针对时间、空间复杂度,顺序表和链表、栈和队列、二叉树以及各类排序算法,持…

Java基础(23)三次握手和四次挥手

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。为确保数据的可靠传输,TCP使用了一系列的控制机制,包括三次握手和四次挥手。这些机制确保了连接的建立、数据…

如何使用client-go构建pod web shell

代码示例及原理 原理是利用websocket协议实现对pod的exec登录,利用client-go构造与远程apiserver的长连接,将对pod容器的输入和pod容器的输出重定向到我们的io方法中,从而实现浏览器端的虚拟终端的效果消息体结构如下 type Connection stru…

Meta更低的训练成本取得更好的性能: 多token预测(Multi-Token Prediction)

Meta提出了一种透过多token预测(Multi-token Prediction)来训练更好、更快的大型语言模型的方法。这篇论文的重点如下: 训练语言模型同时预测多个未来的token,可以提高样本效率(sample efficiency)。 在推论阶段,使用多token预测可以达到最高3倍的加速。 论文的主要贡献包括: …

Django中如何使用WebSocket实时更新数据?

在Django中使用WebSocket实时更新数据,可以通过使用第三方库Django Channels实现。Django Channels是基于WebSocket的实时通信框架,它使得Django应用可以处理实时的、异步的任务。 下面是使用Django Channels实时更新数据的一般步骤: 安装D…

ES集群数据备份与迁移

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、文章涉及概念讲解二、操作步骤1.创建 snapshot repository操作主机hadoop1分别操作从机hadoop2和hadoop3 2. 查看仓库信息3. 备份索引,生成快照…

【S32K UDS BootLoader】-1.1-Unified bootloader Demo和ECUBus工具的使用

<--返回「Autosar_MCAL高阶配置」专栏主页--> 目录 1 下载S32K1/S32K3/S12Z Unified bootloader Demo 1.1 在S32DS中编译S32K312_CAN_bootloader_RTD2d0工程并烧录 2 ECUBus工具使用 2.1 PCAN环境搭建 1.1.1 安装PCAN驱动 1.1.2 安装PCAN-View 2.2 下载并安装ECU…

蓝桥杯 BASIC-26 基础练习 报时助手

蓝桥杯 BASIC-26 基础练习 报时助手 问题描述 给定当前的时间&#xff0c;请用英文的读法将它读出来。 时间用时h和分m表示&#xff0c;在英文的读法中&#xff0c;读一个时间的方法是&#xff1a; 如果m为0&#xff0c;则将时读出来&#xff0c;然后加上“o’clock”&#xff…

嵌入式C语言的变量和函数存储类型

目录 概述 1 嵌入式C的数据类型 2 嵌入式C语言存储类型 2.1 auto存储类型 2.2 extern存储类型 2.3 register存储类型 2.4 static存储类型 概述 本文主要介绍嵌入式C语言中的数据变量的类型&#xff0c;包括其数据长度&#xff0c;在内存中的存储方式。还介绍了数据的存储…

C语言 | Leetcode C语言题解之第77题组合

题目&#xff1a; 题解&#xff1a; int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int* temp malloc(sizeof(int) * (k 1));int tempSize 0;int** ans malloc(sizeof(int*) * 200001);int ansSize 0;// 初始化// 将 temp 中 [0, k - 1] 每个…

Vue项目中使用echarts教程

Vue项目中使用echarts教程 步骤npm 安装ECharts引入 ECharts老版本引入方式 &#xff08;v4版本&#xff09;新版本引入方式 &#xff08;v5版本&#xff09; ECharts初体验ECharts组件化&#xff08;进阶写法&#xff09; 步骤 npm 安装ECharts npm install echarts --save引…