国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

使用keras做SQL注入攻擊的判斷(實(shí)例講解)

2024-07-24 13:15:15
字體:
供稿:網(wǎng)友

本文是通過深度學(xué)習(xí)框架keras來做SQL注入特征識別, 不過雖然用了keras,但是大部分還是普通的神經(jīng)網(wǎng)絡(luò),只是外加了一些規(guī)則化、dropout層(隨著深度學(xué)習(xí)出現(xiàn)的層)。

基本思路就是喂入一堆數(shù)據(jù)(INT型)、通過神經(jīng)網(wǎng)絡(luò)計(jì)算(正向、反向)、SOFTMAX多分類概率計(jì)算得出各個(gè)類的概率,注意:這里只要2個(gè)類別:0-正常的文本;1-包含SQL注入的文本

文件分割上,做成了4個(gè)python文件:

util類,用來將char轉(zhuǎn)換成int(NN要的都是數(shù)字類型的,其他任何類型都要轉(zhuǎn)換成int/float這些才能喂入,又稱為feed)

data類,用來獲取訓(xùn)練數(shù)據(jù),驗(yàn)證數(shù)據(jù)的類,由于這里的訓(xùn)練是有監(jiān)督訓(xùn)練,因此此時(shí)需要返回的是個(gè)元組(x, y)

trainer類,keras的網(wǎng)絡(luò)模型建模在這里,包括損失函數(shù)、訓(xùn)練epoch次數(shù)等

predict類,獲取幾個(gè)測試數(shù)據(jù),看看效果的預(yù)測類

先放trainer類代碼,網(wǎng)絡(luò)定義在這里,最重要的一個(gè),和數(shù)據(jù)格式一樣重要(呵呵,數(shù)據(jù)格式可是非常重要的,在這種程序中)

import SQL注入Dataimport numpy as npimport kerasfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activationfrom keras.layers.normalization import BatchNormalizationfrom keras.optimizers import SGD x, y=SQL注入Data.loadSQLInjectData()availableVectorSize=15x=keras.preprocessing.sequence.pad_sequences(x, padding='post', maxlen=availableVectorSize)y=keras.utils.to_categorical(y, num_classes=2)  model = Sequential()model.add(Dense(64, activation='relu', input_dim=availableVectorSize))model.add(BatchNormalization())model.add(Dropout(0.3))model.add(Dense(64, activation='relu'))model.add(Dropout(0.3))model.add(Dense(2, activation='softmax')) sgd = SGD(lr=0.001, momentum=0.9)model.compile(loss='mse',  optimizer=sgd,  metrics=['accuracy']) history=model.fit(x, y,epochs=500,batch_size=16) model.save('E://sql_checker//models//trained_models.h5')print("DONE, model saved in path-->E://sql_checker//models//trained_models.h5") import matplotlib.pyplot as pltplt.plot(history.history['loss'])plt.title('model loss')plt.ylabel('loss')plt.xlabel('epoch')plt.legend(['train', 'test'], loc='upper left')plt.show()

先來解釋上面這段plt的代碼,因?yàn)樽钊菀捉忉專@段代碼是用來把每次epoch的訓(xùn)練的損失loss value用折線圖表示出來:

keras,SQL,注入攻擊,判斷  

何為訓(xùn)練?何為損失loss value?

訓(xùn)練的目的是為了想讓網(wǎng)絡(luò)最終計(jì)算出來的分類數(shù)據(jù)和我們給出的y一致,那不一致怎么算?不一致就是有損失,也就是說訓(xùn)練的目的是要一致,也就是要損失最小化

怎么讓損失最小化?梯度下降,這里用的是SGD優(yōu)化算法:

from keras.optimizers import SGD sgd = SGD(lr=0.001, momentum=0.9)model.compile(loss='mse',  optimizer=sgd,  metrics=['accuracy'])

上面這段代碼的loss='mse'就是定義了用那種損失函數(shù),還有好幾種損失函數(shù),大家自己參考啊。

optimizer=sgd就是優(yōu)化算法用哪個(gè)了,不同的optimizer有不同的參數(shù)

由于此處用的是全連接NN,因此是需要固定的輸入size的,這個(gè)函數(shù)就是用來固定(不夠會補(bǔ)0) 特征向量size的:

x=keras.preprocessing.sequence.pad_sequences(x, padding='post', maxlen=availableVectorSize)

再來看看最終的分類輸出,是one hot的,這個(gè)one hot大家自己查查,很容易的定義,就是比較浪費(fèi)空間,分類間沒有關(guān)聯(lián)性,不過用在這里很方便

y=keras.utils.to_categorical(y, num_classes=2)

然后再說說預(yù)測部分代碼:

import SQL注入Dataimport Converter  import numpy as npimport kerasfrom keras.models import load_model print("predict....") x=SQL注入Data.loadTestSQLInjectData()x=keras.preprocessing.sequence.pad_sequences(x, padding='post', maxlen=15) model=load_model('E://sql_checker//models//trained_models.h5')result=model.predict_classes(x, batch_size=len(x))result=Converter.convert2label(result)print(result)  print("DONE")

這部分代碼很容易理解,并且連y都沒有  

keras,SQL,注入攻擊,判斷  

好了,似乎有那么點(diǎn)意思了吧。

下面把另外幾個(gè)工具類、數(shù)據(jù)類代碼放出來:

def toints(sentence): base=ord('0') ary=[] for c in sentence:  ary.append(ord(c)-base) return ary  def convert2label(vector): string_array=[] for v in vector:  if v==1:   string_array.append('SQL注入')  else:   string_array.append('正常文本') return string_array
import Converterimport numpy as np def loadSQLInjectData(): x=[] x.append(Converter.toints("100")) x.append(Converter.toints("150")) x.append(Converter.toints("1")) x.append(Converter.toints("3")) x.append(Converter.toints("19")) x.append(Converter.toints("37")) x.append(Converter.toints("1'--")) x.append(Converter.toints("1' or 1=1;--")) x.append(Converter.toints("updatable")) x.append(Converter.toints("update tbl")) x.append(Converter.toints("update someb")) x.append(Converter.toints("update")) x.append(Converter.toints("updat")) x.append(Converter.toints("update a")) x.append(Converter.toints("'--")) x.append(Converter.toints("' or 1=1;--")) x.append(Converter.toints("aupdatable")) x.append(Converter.toints("hello world"))  y=[[0],[0],[0],[0],[0],[0],[1],[1],[0],[1],[1],[0],[0],[1],[1],[1],[0],[0]]  x=np.asarray(x) y=np.asarray(y)  return x, y  def loadTestSQLInjectData():  x=[] x.append(Converter.toints("some value")) x.append(Converter.toints("-1")) x.append(Converter.toints("' or 1=1;--")) x.append(Converter.toints("noupdate")) x.append(Converter.toints("update ")) x.append(Converter.toints("update")) x.append(Converter.toints("update z")) x=np.asarray(x) return x

以上這篇使用keras做SQL注入攻擊的判斷(實(shí)例講解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐清市| 宁陕县| 丘北县| 崇义县| 杭锦后旗| 华蓥市| 泰州市| 钟祥市| 稷山县| 海门市| 沾益县| 长岛县| 洪泽县| 社旗县| 平原县| 休宁县| 屏东市| 定兴县| 马山县| 嘉定区| 林甸县| 天祝| 腾冲县| 若尔盖县| 广宁县| 昭苏县| 洞口县| 金山区| 罗甸县| 庐江县| 体育| 鹿泉市| 明水县| 昌图县| 突泉县| 北海市| 霸州市| 马山县| 澄迈县| 贵溪市| 巴林左旗|