ADO.Net+SQLiteでインジェクションを防げ!プリペアドステートメント!

キーワードをタイトルに盛り込んだらやたら長くなりましたな。
今回も解説サイトが意外と少なくて困るSQLiteの話です。

初めに何がしたいかって話を簡単にすると、
ADO.NetとSQLite環境でインジェクションと呼ばれる攻撃を防ぐサンプル載せますってだけです。
ちなみに言語は今をときめく(と思ってる)C#です。

インジェクションとはSQL構文の隙をついて悪さをすることです。
例えば、DBからあるカラムを検索したいとき、検索条件を引数(arg)でもらってくるとして、SQLコマンド文をこんな感じで用意しておいたとします。

string cmd = "SELECT * FROM TableName WHERE ID = " + arg + ";";

もしここでargに”‘x’ or 1=1″なんて渡しちゃうと、コマンド文が

SELECT * FROM TableName WHERE ID = 'x' or 1 = 1;

になってしまい、TableNameテーブルの中身が全てひっかかってしまいますよー
これをプリペアドステートメントって技術を使って防ぎましょーって話です。

やりたい事のイメージはそんなに変わらないです。
コマンドを用意しておく。条件は引数でもらう。ただしインジェクションされない。それだけ。

前置きが長くなりましたが、サンプルです。
SQLiteのコマンドは前置きと同様に用意しますが、変数argを入れていた場所には”?”を入れておきます。
変数argを使うのは、SQLiteDataAdapterインスタンスを利用してDBの中身を取得する時です。

// 用意しておくコマンドの条件部分には?を入れておく
string cmd = "SELECT * FROM TableName WHERE ID = ?;";

// SQLiteDBへ接続
SQLiteConnection connection = new SQLiteConnection();
connection.ConnectionString = "Data Source=…(中略)…\\ファイル名.db"
connection.SetPassword("パスワード"); // パスワードを設定してる場合に必要
connection.Open();

// DBの格納場所を確保
DataSet dataSet = new DataSet();

// 接続アダプタを生成
SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd, connection);

// ここで変数を入れる
adapter.SelectCommand.Parameters.Add(new SQLiteParameter("ID", arg));

// DB読み込み
adapter.Fill(dataSet);

他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。

1件のコメント

返信を残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)