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

C#でSQLiteいじった時と同様、VBAであろうとインジェクションを防がねばなりません。

今回vbRichClientを利用していますが、ちゃんとプリペアドステートメント用のAPIも用意されています。
それがcCommandクラスとcSelectCommandクラスです。
使い分けも簡単、SELECT文を発行して戻り値にデータを取得したいならcSelectCommandクラス、UPDATE文など発行して成否結果だけを取得したいならcCommandクラスです。

ちなみに利用するDBはID(INTEGER)とNAME(TEXT)を持つSampleテーブルに、ID = 1から5まで5レコード入っていることと仮定しましょ。
さらに、cConnectionクラスオブジェクト変数objConnには、既にコネクションがはられているとします。
なに言ってるのかわからない人は前回の記事を参照してください。

cSelectCommandの使い方

ID = 5のレコードをとってみます。

' Select結果を返してもらいたいコマンドオブジェクト
Dim objSelect As vbRichClient5.cSelectCommand

' 代入したい部分は?をいれておく
Set objSelect = objConn.CreateSelectCommand("SELECT * FROM Sample WHERE ID = ?;")

' 1番目の?にいれるデータを格納(ここでは数値)
Call objSelect.SetInt32(1, 5)

' cConnection.Executeではなく、cCommand.Executeを利用する
' ID = 5のレコードのみ抽出される
Dim objRecSet As vbRichClient5.cRecordset
Set objRecSet = objSelect.Execute

cCommandの使い方

ID = 5のレコードのNameを適当に変えてみます。
この方法はレコード操作に対してのみ有効のようです。
CREATE TABLEやDROP TABLEにも使おうとすると、CreateCommandした時点で例外すっ飛んでくるのでご注意を。

' 成否判定が返ればいいコマンドオブジェクト
Dim objCommand As vbRichClient5.cCommand

' 代入したい部分は?をいれておく
Set objCommand = objConn.CreateCommand("UPDATE Sample SET NAME = ? WHERE ID = ?;")

' 1番目の?にいれるデータを格納(ここではテキスト)
Call objCommand.SetText(1, "★変更したい★")

' 2番目の?にいれるデータを格納(ここでは数値)
Call objCommand.SetInt32(2, 5)

' トランザクションを開始して実行!
objConn.BeginTrans
' cConnection.Executeではなく、cCommand.Executeを利用する
' 実行結果はBoolean
If Not objCommand.Execute Then
    objConn.RollbackTrans
End If
objConn.CommitTrans

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

1件のコメント

返信を残す

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

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