In diesem Artikel wird das Deep-Learning-Framework Keras verwendet, um SQL-Injection-Merkmalserkennung durchzuführen. Obwohl Keras verwendet wird, sind die meisten neuronalen Netzwerke immer noch gewöhnliche neuronale Netzwerke, denen nur einige Regularisierungs- und Dropout-Schichten (Schichten, die bei Deep Learning auftreten) hinzugefügt wurden. Die Grundidee besteht darin, eine Reihe von Daten (Typ INT) einzuspeisen, die Wahrscheinlichkeit jeder Klasse durch neuronale Netzwerkberechnung (vorwärts und rückwärts) zu berechnen und die Wahrscheinlichkeitsberechnung für mehrere Klassifizierungen von SOFTMAX durchzuführen. Hinweis: Hier gibt es nur 2 Kategorien: 0 – normaler Text; 1 – Text mit SQL-Injection Im Hinblick auf die Dateisegmentierung werden 4 Python-Dateien erstellt: Util-Klasse, die zum Konvertieren von char in int verwendet wird (NN erfordert numerische Typen, alle anderen Typen müssen in int/float konvertiert werden, bevor sie eingespeist werden können, auch als Feed bezeichnet) Die Datenklasse wird verwendet, um Trainingsdaten und Verifizierungsdaten abzurufen. Da es sich hier bei dem Training um ein überwachtes Training handelt, muss zu diesem Zeitpunkt ein Tupel (x, y) zurückgegeben werden. Trainerklasse, Modellierung des Keras-Netzwerkmodells hier, einschließlich Verlustfunktion, Trainingsepochennummer usw. Klasse vorhersagen, einige Testdaten abrufen und die Wirkung der Vorhersageklasse sehen Geben Sie zuerst den Trainerklassencode ein. Hier befindet sich die Netzwerkdefinition. Sie ist die wichtigste und genauso wichtig wie das Datenformat (haha, das Datenformat ist bei dieser Art von Programm sehr wichtig). SQL-Injection-Daten importieren importiere Numpy als np Keras importieren von keras.models importiere Sequential aus keras.layers importiere Dense, Dropout, Aktivierung von keras.layers.normalization importiere BatchNormalization von keras.optimizers importiere SGD x, y=SQL-InjectionData.loadSQLInjectData() verfügbareVektorgröße=15 x = keras.preprocessing.sequence.pad_sequences(x, Polsterung='post', maxlen=verfügbareVektorgröße) y = keras.utils.to_categorical(y, Anzahl_Klassen=2) Modell = Sequentiell() model.add(Dense(64, Aktivierung='relu', input_dim=verfügbareVektorgröße)) Modell.Hinzufügen(BatchNormalisierung()) Modell.Hinzufügen(Ausfall(0,3)) model.add(Dense(64, Aktivierung='relu')) Modell.Hinzufügen(Ausfall(0,3)) model.add(Dense(2, Aktivierung='softmax')) sgd = SGD(lr=0,001, Impuls=0,9) Modell.Kompilieren(Verlust='mse', Optimierer = sgd, Metriken = ['Genauigkeit']) Verlauf = Modell.Fit(x, y, Epochen = 500, Batchgröße = 16) model.save('E:\\sql_checker\\models\\trainierte_modelle.h5') drucken("FERTIG, Modell gespeichert im Pfad-->E:\\sql_checker\\models\\trained_models.h5") importiere matplotlib.pyplot als plt plt.plot(History.History['Verlust']) plt.title('Modellverlust') plt.ylabel('Verlust') plt.xlabel('Epoche') plt.legend(['trainieren', 'testen'], loc='oben links') plt.anzeigen() Lassen Sie uns zunächst den obigen PLT-Code erklären, da dieser am einfachsten zu erklären ist. Dieser Code wird verwendet, um den Verlustwert jedes Epochentrainings mit einem Liniendiagramm anzuzeigen: Was ist Training? Was ist der Verlustwert? Der Zweck des Trainings besteht darin, die vom Netzwerk schließlich berechneten Klassifizierungsdaten mit dem von uns angegebenen y in Einklang zu bringen. Wie berechnet man die Inkonsistenz? Inkonsistenz bedeutet Verlust, daher besteht der Zweck des Trainings darin, konsistent zu sein, d. h. den Verlust zu minimieren. Wie lassen sich Verluste minimieren? Gradientenabstieg, hier wird der SGD-Optimierungsalgorithmus verwendet: von keras.optimizers importiere SGD sgd = SGD(lr=0,001, Impuls=0,9) Modell.Kompilieren(Verlust='mse', Optimierer = sgd, Metriken = ['Genauigkeit']) Der Verlust = 'mse' im obigen Code definiert die zu verwendende Verlustfunktion. Es gibt mehrere andere Verlustfunktionen. Sie können diese selbst nachschlagen. optimizer=sgd ist der zu verwendende Optimierungsalgorithmus. Verschiedene Optimierer haben unterschiedliche Parameter. Da hier ein voll verbundenes NN verwendet wird, ist eine feste Eingangsgröße erforderlich. Mit dieser Funktion wird die Größe des Merkmalsvektors festgelegt (wenn sie nicht ausreicht, wird 0 hinzugefügt): x = keras.preprocessing.sequence.pad_sequences(x, Polsterung='post', maxlen=verfügbareVektorgröße) Werfen wir einen Blick auf die endgültige Klassifizierungsausgabe. Sie ist heiß. Sie können sie selbst überprüfen. Sie ist sehr einfach zu definieren. Es ist reine Platzverschwendung. Es gibt keine Korrelation zwischen den Kategorien, aber sie ist hier sehr praktisch zu verwenden. y = keras.utils.to_categorical(y, Anzahl_Klassen=2) Lassen Sie uns dann über den Vorhersagecode sprechen: SQL-Injection-Daten importieren Importkonverter importiere Numpy als np Keras importieren von keras.models importiere load_model drucken("vorhersagen...") x=SQL InjectionData.loadTestSQLInjectData() x = keras.preprocessing.sequence.pad_sequences(x, Polsterung='post', maxlen=15) Modell = Modell laden('E:\\sql_checker\\Modelle\\trainierte_Modelle.h5') Ergebnis = Modell.predict_classes(x, Batchgröße = Länge(x)) Ergebnis = Konverter.convert2label(Ergebnis) drucken(Ergebnis) drucken("FERTIG") Dieser Teil des Codes ist leicht zu verstehen, und es gibt kein y Okay, das scheint Sinn zu machen. Hier sind einige andere Werkzeug- und Datenklassencodes: def toints (Satz): Basis=ord('0') ary=[] für c im Satz: ary.append(ord(c)-base) Rückkehr def convert2label(Vektor): Zeichenfolgenarray=[] für v im Vektor: wenn v==1: string_array.append('SQL-Injektion') anders: string_array.append('normaler Text') Zeichenfolgen-Array zurückgeben Importkonverter importiere Numpy als np def loadSQLInjectData(): x=[] x.anhängen(Converter.toints("100")) x.anhängen(Converter.toints("150")) x.anhängen(Converter.toints("1")) x.anhängen(Converter.toints("3")) x.anhängen(Converter.toints("19")) x.anhängen(Converter.toints("37")) x.anhängen(Converter.toints("1'--")) x.append(Converter.toints("1' oder 1=1;--")) x.append(Converter.toints("aktualisierbar")) x.append(Converter.toints("Tabelle aktualisieren")) x.append(Converter.toints("aktualisiere etwas")) x.anhängen(Converter.toints("aktualisieren")) x.append(Converter.toints("updat")) x.append(Converter.toints("aktualisiere a")) x.anhängen(Converter.toints("'--")) x.append(Converter.toints("' oder 1=1;--")) x.append(Converter.toints("aupdatable")) x.append(Converter.toints("Hallo Welt")) y=[[0],[0],[0],[0],[0],[0],[1],[1],[0],[1],[0],[1],[0],[1],[0],[1],[0],[1],[0],[1],[0],[0]] x = np.asarray(x) y = np.alsarray(y) Rückgabewert x, y def loadTestSQLInjectData(): x=[] x.append(Converter.toints("ein Wert")) x.anhängen(Converter.toints("-1")) x.append(Converter.toints("' oder 1=1;--")) x.append(Converter.toints("kein Update")) x.append(Converter.toints("aktualisieren")) x.anhängen(Converter.toints("aktualisieren")) x.anhängen(Converter.toints("update z")) x = np.asarray(x) Rückgabe x Der obige Artikel über die Verwendung von Keras zur Beurteilung von SQL-Injection-Angriffen (mit Beispielen) ist alles, was ich mit Ihnen teilen kann. Ich hoffe, er kann Ihnen als Referenz dienen, und ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Das könnte Sie auch interessieren:
|
Der spezifische Code lautet wie folgt: /*Breite d...
So erstellen Sie einen Dienst und starten ihn aut...
Einführung in Jib Jib ist eine von Google entwick...
Vorwort: Ich wollte schon immer wissen, wie eine ...
Inhaltsverzeichnis Was ist das Protokoll langsame...
Inhaltsverzeichnis Installationsfreie Version von...
Abfrage-Cache 1. Funktionsprinzip des Abfrage-Cac...
Jetzt ist .net Core plattformübergreifend und jed...
0x00 Einführung Vor einigen Monaten habe ich eine...
Inhaltsverzeichnis Strategie zur Ausführung föder...
1. Erstellen Sie zuerst die Datei (wechseln Sie p...
Abfragen der Datenbank Wählen Sie * aus `Student`...
Oftmals wird nach der Fertigstellung eines Webdes...
In diesem Artikel wird der spezifische JS-Code zu...
Inhaltsverzeichnis Problembeschreibung 1. Basislö...