Keras を使って SQL インジェクション攻撃を判断する (例の説明)

Keras を使って SQL インジェクション攻撃を判断する (例の説明)

この記事では、ディープラーニングフレームワーク 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 を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • asp.net で SQL インジェクション攻撃コードを検出する

<<:  Reactの新バージョンのライフサイクルフック機能と使用方法の詳細な説明

>>:  Linuxシステムはポート3306、8080などを外部に開放します。ファイアウォール設定の詳しい説明

推薦する

一般的なテーブルコンポーネントの Vue カプセル化の完全な手順記録

目次序文テーブル コンポーネントをカプセル化する必要があるのはなぜですか?ステップ1: 共通コンポー...

Prometheusコンテナのデプロイメントのための実用的なソリューション

環境ホスト名IPアドレス仕えるプロメテウス192.168.237.137プロメテウス、グラファナノー...

幅と高さが可変の要素を中央に配置するための CSS ソリューション

1. 水平中央公開コード: html: <div class="parent&quo...

MySQL 5.x 以降を使用している場合のエラー #1929 列 ''createtime'' の日付時刻値が正しくありません: '''' の簡単な解決方法

MySQL をインストールした後、テーブル データを保存および削除しようとすると、常にエラー メッセ...

VMwareがLinuxシステムをインストールして起動した後に黒い画面が表示される問題を解決する

1. 設置環境1. HUAWEI mate x CPU i5 82500u、8g メモリ、独立グラフ...

Node.jsサービスDockerコンテナアプリケーション実践のまとめ

この記事では、Docker コマンドの使用とインストールについては説明しません。Docker を基礎...

Dockerfileを使用してDockerイメージを構築する手順

Dockerfile は、命令を含むテキスト ファイルです。各命令はレイヤーを構築するため、各命令の...

IE環境では、divの高さはフォントの高さよりも大きくなければならないと規定されています。

コードをコピーコードは次のとおりです。 <div class="content&qu...

CSS3 @mediaの基本的な使い方のまとめ

//文法: @media mediatype and | not | only (メディア機能) ...

Docker での WSL の構成と変更の問題について

https://docs.microsoft.com/ja-jp/windows/wsl/wsl-...

CSSはグラデーションを巧みに利用して高度な背景光アニメーションを実現します

成し遂げるこの効果は CSS を使用して完全に再現することは困難です。 CSS でシミュレートされた...

DIV の一般的なタスク (パート 1) — 一般的なタスク (スクロール バーの表示、div の非表示、イベント バブリングの無効化など)

最も一般的に使用されるレイアウト要素として、DIV は Web 開発において重要な役割を果たします。...

Vue3 を使用してアップロード コンポーネントを実装するためのサンプル コード

目次一般的なアップロードコンポーネントの開発以下の機能を実装する必要がありますカスタムテンプレートサ...

Linux の EXT シリーズファイルシステムフォーマットの詳細な説明

Linux ファイルシステム一般的なハードディスクは上図のとおりです。各ディスクは複数のトラックに分...

よく使われるn番目の子セレクターをまとめる

序文フロントエンドプログラミングでは、奇数、偶数などの数値を受け入れることができる nth-chil...