【入門編】【SQLインジェクション対策】ADODB.Command パラメータ化クエリによるセキュアなデータベース操作の実装 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは。業務自動化の世界へようこそ。

VBScriptという言語は、一見すると「枯れた古いツール」に見えるかもしれません。しかし、Windows環境でこれほど軽量かつ強力にシステムを操れる言語は他にありません。特にデータベース操作を行う際、あなたは「魔法」と「災厄」のどちらを扱うかを選べる立場にあります。

今回は、現場のプロが最も恐れ、そして最も厳格に管理する「SQLインジェクション」という災厄を封じ込め、安全にデータを操作するための「パラメータ化クエリ」について解説します。

—

1. 文字列結合は「禁忌」である

多くの初心者が最初に陥る罠が、SQL文を文字列結合で作ってしまうことです。

‘ 【絶対にしてはいけない例】
userName = InputBox(“ユーザー名を入力”)
sql = “SELECT FROM Users WHERE Name = ‘” & userName & “‘”

もしユーザーが入力欄に `’ OR ‘1’=’1` と入力したらどうなるか?
SQL文は `SELECT FROM Users WHERE Name = ” OR ‘1’=’1’` となり、パスワード認証を回避したり、全データを盗み出されたりします。これがSQLインジェクションです。

文字列結合でSQLを作ることは、自分の家の鍵を道端に落とすのと同じです。「変数はそのままSQLに混ぜてはいけない」。これが鉄則です。

—

2. ADODB.Command で「壁」を作る

では、どうすれば安全なのか。答えは ADODB.Command オブジェクト です。
これを使うと、SQLの「命令部分」と「データ部分」を完全に分離できます。データベースエンジンに対して、「ここは命令だよ」「ここはただのデータだよ」と別々に伝えることで、悪意あるコードを実行させない「壁」を築くのです。

セキュアな実装コード

以下のコードは、現場でそのまま使えるテンプレートです。

Option Explicit

Dim conn, cmd, rs, userName
userName = “太郎” ‘ ここは動的に受け取っても安全です

‘ 1. 接続の確立(環境に合わせて調整してください)
Set conn = CreateObject(“ADODB.Connection”)
conn.Open “Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DBName;User ID=User;Password=Pass;”

‘ 2. Commandオブジェクトの生成
Set cmd = CreateObject(“ADODB.Command”)
Set cmd.ActiveConnection = conn

‘ 3. SQL文を定義(データ部分は ? でプレースホルダーを置く)
cmd.CommandText = “SELECT FROM Users WHERE Name = ?”
cmd.CommandType = 1 ‘ adCmdText

‘ 4. パラメータの追加(ここが最も重要!)
‘ CreateParameter(名前, 型, 方向, サイズ, 値)
‘ 202 は adVarWChar (文字列型)
cmd.Parameters.Append cmd.CreateParameter(“@Name”, 202, 1, 50, userName)

‘ 5. 実行
Set rs = cmd.Execute

‘ 結果の表示
If Not rs.EOF Then
WScript.Echo “ユーザーが見つかりました: ” & rs(“Name”)
End If

‘ 6. 後片付け(リソースの解放はエンジニアの嗜み)
rs.Close
conn.Close
Set rs = Nothing
Set cmd = Nothing
Set conn = Nothing

—

3. なぜ「CreateParameter」が最強なのか

このコードのポイントは `cmd.CreateParameter` です。

  • 型の明示: データ型を指定することで、データベース側は「これは文字列として扱う」と確定させます。たとえ入力値にSQLコマンドが含まれていても、単なる「ただの文字列」として処理されるため、SQLとして実行されることはありません。
  • 分離の美学: 命令とデータが分かれているため、どんなに複雑な入力が来ても、SQLの骨格が崩れる心配はありません。

—

4. 初学者が陥りやすいエラーと対策

最後に、現場でよく見る「動かない!」という悲鳴への回答を残しておきます。

  • 「パラメータの数が合わない」エラー:

SQL文の中の `?` の数と、`cmd.Parameters.Append` した回数が一致しているか確認してください。

  • 型が合わないエラー:

`CreateParameter` の第2引数(型番号)が正しいか確認しましょう。文字列なら `202` (adVarWChar)、整数なら `3` (adInteger) です。

  • 接続エラー:

`conn.Open` の文字列はOSの環境(ODBCドライバの有無など)に強く依存します。まずはExcelやAccessのDBで接続テストを行い、確実に接続できる文字列を特定してから組むのが近道です。

—

最後に:プロへの第一歩

VBScriptは、書いたコードの質がそのままシステムの寿命に直結します。
今回紹介した「パラメータ化クエリ」を使えるようになるだけで、あなたは「動くコードを書く人」から、「安全で堅牢な仕組みを構築できるエンジニア」へと一歩踏み出せました。

自動化の旅路は長いですが、まずはこの「入口」を完璧に掌握してください。ここをクリアすれば、もうSQLインジェクションの恐怖に夜も眠れない…なんてことはなくなります。

また次の講義でお会いしましょう。あなたのコードが、より美しく、より強固になることを期待しています。

タイトルとURLをコピーしました