この記事では、ディープラーニングフレームワーク keras を使用して、SQL インジェクションの特徴認識を実行します。keras が使用されていますが、ニューラルネットワークのほとんどは通常のニューラルネットワークであり、いくつかの正規化レイヤーとドロップアウトレイヤー (ディープラーニングで表示されるレイヤー) が追加されているだけです。 基本的な考え方は、大量のデータ(INT型)を入力し、ニューラルネットワーク計算(順方向と逆方向)とSOFTMAXマルチ分類確率計算によって各クラスの確率を計算することです。注:ここでは2つのカテゴリしかありません:0-通常のテキスト、1-SQLインジェクションを含むテキスト ファイルのセグメント化に関しては、4 つの Python ファイルが作成されます。 Util クラス。char を int に変換するために使用されます (NN には数値型が必要です。その他の型は、フィードする前に int/float に変換する必要があります。フィードとも呼ばれます) データクラスは、トレーニングデータと検証データを取得するために使用します。ここでのトレーニングは教師ありトレーニングなので、このときタプル (x, y) を返す必要があります。 トレーナー クラス、損失関数、トレーニング エポック数などを含む Keras ネットワーク モデルのモデリングをここで行います。 クラスを予測し、テストデータを取得して予測クラスの効果を確認します まずトレーナークラスのコードを入れます。ネットワーク定義はここで最も重要なもので、データ形式と同じくらい重要です(笑、この種のプログラムではデータ形式が非常に重要です) SQLインジェクションデータのインポート numpyをnpとしてインポートする kerasをインポートする keras.modelsからSequentialをインポートする keras.layers から Dense、Dropout、Activation をインポートします keras.layers.normalization から BatchNormalization をインポートします keras.optimizers から SGD をインポートします x, y=SQLインジェクションデータ.loadSQLInjectData() 利用可能なベクトルサイズ=15 x = keras.preprocessing.sequence.pad_sequences(x、パディング='post'、maxlen=availableVectorSize) y = keras.utils.to_categorical(y, num_classes=2) モデル = シーケンシャル() model.add(Dense(64, activation='relu', input_dim=availableVectorSize)) モデルを追加します(バッチ正規化()) モデルを追加します(ドロップアウト(0.3)) model.add(Dense(64, activation='relu')) モデルを追加します(ドロップアウト(0.3)) model.add(Dense(2, activation='softmax')) sgd = SGD(lr=0.001、モメンタム=0.9) モデル.コンパイル(損失='mse', オプティマイザー=sgd、 メトリック=['精度']) 履歴 = model.fit(x, y, エポック = 500, バッチサイズ = 16) モデルを保存します('E:\\sql_checker\\models\\trained_models.h5') print("完了、モデルがパス-->E:\\sql_checker\\models\\trained_models.h5に保存されました") matplotlib.pyplot を plt としてインポートします。 plt.plot(履歴.履歴['損失']) plt.title('モデル損失') plt.ylabel('損失') plt.xlabel('エポック') plt.legend(['train', 'test'], loc='左上') plt.show() まず、最も説明しやすい上記の plt コードについて説明しましょう。このコードは、各エポック トレーニングの損失値を折れ線グラフで表示するために使用されます。 トレーニングとは何ですか?損失値とは何ですか? トレーニングの目的は、ネットワークによって最終的に計算された分類データを、指定した y と一致させることです。不一致をどのように計算するのでしょうか?一貫性がないということは損失を意味します。つまり、トレーニングの目的は一貫性を保つこと、つまり損失を最小限に抑えることです。 損失を最小限に抑えるにはどうすればいいですか?ここでは勾配降下法、SGD 最適化アルゴリズムが使用されます。 keras.optimizers から SGD をインポートします sgd = SGD(lr=0.001、モメンタム=0.9) モデル.コンパイル(損失='mse', オプティマイザー=sgd、 メトリック=['精度']) 上記のコードの loss='mse' は、使用する損失関数を定義します。 損失関数は他にもいくつかあります。 自分で参照することができます。 optimizer=sgd は使用する最適化アルゴリズムです。オプティマイザーによってパラメーターが異なります。 ここでは完全に接続されたNNが使用されるため、固定の入力サイズが必要です。この関数は、特徴ベクトルのサイズを固定するために使用されます(十分でない場合は、0が追加されます)。 x = keras.preprocessing.sequence.pad_sequences(x、パディング='post'、maxlen=availableVectorSize) 最終的な分類出力を見てみましょう。1ホットです。自分で確認できます。定義は非常に簡単です。スペースの無駄です。カテゴリ間の相関はありませんが、ここで使用すると非常に便利です。 y = keras.utils.to_categorical(y, num_classes=2) それでは予測コードについてお話ししましょう。 SQLインジェクションデータのインポート インポートコンバータ numpyをnpとしてインポートする kerasをインポートする keras.modelsからload_modelをインポートする print("予測....") x=SQL インジェクションデータ.loadTestSQLInjectData() x = keras.preprocessing.sequence.pad_sequences(x、パディング='post'、最大長=15) モデル = load_model('E:\\sql_checker\\models\\trained_models.h5') 結果 = model.predict_classes(x, バッチサイズ = len(x)) 結果 = Converter.convert2label(結果) 印刷(結果) print("完了") この部分のコードは理解しやすく、 わかりました。それは理にかなっているようです。 その他のツールおよびデータ クラス コードは次のとおりです。 def toints(文): 基数=ord('0') ary=[] 文中のcについて: ary.append(ord(c)-base) 戻り値 def convert2label(ベクトル): 文字列配列=[] ベクトルのvの場合: v==1の場合: string_array.append('SQLインジェクション') それ以外: string_array.append('通常のテキスト') 文字列配列を返す インポートコンバータ numpyをnpとしてインポートする デフロードSQLInjectData(): 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' または 1=1;--")) x.append(Converter.toints("更新可能")) x.append(Converter.toints("tbl を更新")) x.append(Converter.toints("someb を更新")) x.append(Converter.toints("更新")) x.append(Converter.toints("updat")) x.append(Converter.toints("更新")) x.append(Converter.toints("'--")) x.append(Converter.toints("' または 1=1;--")) x.append(Converter.toints("更新可能")) x.append(Converter.toints("hello world")) y=[[0],[0],[0],[0],[0],[0],[1],[1],[0],[1],[0],[1],[0],[1],[0],[0],[1],[0],[1],[0],[1],[0],[0],[1],[0],[0]] x = np.asarray(x) y = np.asarray(y) x, yを返す デフロードテストSQLInjectData(): x=[] x.append(Converter.toints("何らかの値")) x.append(Converter.toints("-1")) x.append(Converter.toints("' または 1=1;--")) x.append(Converter.toints("noupdate")) x.append(Converter.toints("更新 ")) x.append(Converter.toints("更新")) x.append(Converter.toints("zを更新")) x = np.asarray(x) xを返す keras を使用して SQL インジェクション攻撃を判断する方法に関する上記の記事 (例付き) が、私が皆さんに共有できるすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Reactの新バージョンのライフサイクルフック機能と使用方法の詳細な説明
>>: Linuxシステムはポート3306、8080などを外部に開放します。ファイアウォール設定の詳しい説明
まずMySQLの公式ドキュメントを見てみましょう: 5.7 {データベース | スキーマ} を作成 ...
環境: (docker、k8s クラスター)、前回 docker で起動した Java プログラムの...
この記事では、MySQL の sql_mode モードについて例を挙げて説明します。ご参考までに、詳...
序文:前回の記事では、MySQL システムでよく使用されるログをいくつか説明しました。実は、トランザ...
目次1. 監視Linuxホストを追加する2. メールボックスを設定する1. 監視Linuxホストを追...
MariaDB データベース管理システムは MySQL のブランチであり、主にオープンソース コミュ...
バージョン番号を非表示バージョン番号は非表示になっていません。セキュリティを強化するために、バージョ...
Awk は、ソートを含む他の一般的なユーティリティによって実行できるいくつかのタスクを実行できる強...
環境: 1. Windows Server 2016 Datacenter 64 ビット 2. SQ...
MySQL 最大接続数の表示と最大接続数の変更1. 最大接続数を確認する '%max_con...
CentOS 8 が正式にリリースされました! CentOS は Red Hat の再配布ポリシー...
シナリオ:テーブル内のデータは、同期ツールを使用して他のデータベースと同期する必要があり、増分同期に...
データは企業の中核資産であり、企業にとって最も重要なタスクの 1 つです。注意しないと、データが意図...
1. インターネットで長時間検索しましたが、判定表が存在するかどうかがわからなかったので、漠然と削除...
境界線のスタイルborder-style プロパティは、表示する境界線の種類を指定します。 bord...