本文是通過(guò)深度學(xué)習(xí)框架keras來(lái)做SQL注入特征識(shí)別, 不過(guò)雖然用了keras,但是大部分還是普通的神經(jīng)網(wǎng)絡(luò),只是外加了一些規(guī)則化、dropout層(隨著深度學(xué)習(xí)出現(xiàn)的層)。
基本思路就是喂入一堆數(shù)據(jù)(INT型)、通過(guò)神經(jīng)網(wǎng)絡(luò)計(jì)算(正向、反向)、SOFTMAX多分類(lèi)概率計(jì)算得出各個(gè)類(lèi)的概率,注意:這里只要2個(gè)類(lèi)別:0-正常的文本;1-包含SQL注入的文本
文件分割上,做成了4個(gè)python文件:
util類(lèi),用來(lái)將char轉(zhuǎn)換成int(NN要的都是數(shù)字類(lèi)型的,其他任何類(lèi)型都要轉(zhuǎn)換成int/float這些才能喂入,又稱為feed)
data類(lèi),用來(lái)獲取訓(xùn)練數(shù)據(jù),驗(yàn)證數(shù)據(jù)的類(lèi),由于這里的訓(xùn)練是有監(jiān)督訓(xùn)練,因此此時(shí)需要返回的是個(gè)元組(x, y)
trainer類(lèi),keras的網(wǎng)絡(luò)模型建模在這里,包括損失函數(shù)、訓(xùn)練epoch次數(shù)等
predict類(lèi),獲取幾個(gè)測(cè)試數(shù)據(jù),看看效果的預(yù)測(cè)類(lèi)
先放trainer類(lèi)代碼,網(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() |
先來(lái)解釋上面這段plt的代碼,因?yàn)樽钊菀捉忉專@段代碼是用來(lái)把每次epoch的訓(xùn)練的損失loss value用折線圖表示出來(lái):
何為訓(xùn)練?何為損失loss value?
訓(xùn)練的目的是為了想讓網(wǎng)絡(luò)最終計(jì)算出來(lái)的分類(lèi)數(shù)據(jù)和我們給出的y一致,那不一致怎么算?不一致就是有損失,也就是說(shuō)訓(xùn)練的目的是要一致,也就是要損失最小化
怎么讓損失最小化?梯度下降,這里用的是SGD優(yōu)化算法: