本文是通過深度學習框架keras來做SQL注入特征識別, 不過雖然用了keras,但是大部分還是普通的神經網絡,只是外加了一些規則化、dropout層(隨著深度學習出現的層)。
基本思路就是喂入一堆數據(INT型)、通過神經網絡計算(正向、反向)、SOFTMAX多分類概率計算得出各個類的概率,注意:這里只要2個類別:0-正常的文本;1-包含SQL注入的文本
文件分割上,做成了4個python文件:
util類,用來將char轉換成int(NN要的都是數字類型的,其他任何類型都要轉換成int/float這些才能喂入,又稱為feed)
data類,用來獲取訓練數據,驗證數據的類,由于這里的訓練是有監督訓練,因此此時需要返回的是個元組(x, y)
trainer類,keras的網絡模型建模在這里,包括損失函數、訓練epoch次數等
predict類,獲取幾個測試數據,看看效果的預測類
先放trainer類代碼,網絡定義在這里,最重要的一個,和數據格式一樣重要(呵呵,數據格式可是非常重要的,在這種程序中)
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的代碼,因為最容易解釋,這段代碼是用來把每次epoch的訓練的損失loss value用折線圖表示出來:
何為訓練?何為損失loss value?
訓練的目的是為了想讓網絡最終計算出來的分類數據和我們給出的y一致,那不一致怎么算?不一致就是有損失,也就是說訓練的目的是要一致,也就是要損失最小化
怎么讓損失最小化?梯度下降,這里用的是SGD優化算法: