SQL Server × Access

SQLインジェクションとは無縁?入力チェックとパラメータ化クエリの重要性

nanikatoaccess

以下では、「SQLインジェクションとは無縁?入力チェックとパラメータ化クエリの重要性」をテーマに、Microsoft Accessで起こり得るSQLインジェクションリスクを解説しつつ、安全にデータを扱うための対策を紹介します。「AccessはデスクトップDBだから大丈夫」と思いがちですが、フォームやクエリで文字列連結によるSQL操作を行っていると、思わぬ抜け穴になることがあります。しっかりとした入力チェックパラメータ化クエリを実践し、安全なシステムを運用しましょう。


1. SQLインジェクションとは?

SQLインジェクションは、ユーザーからの入力をそのままSQL文に組み込むことで、意図しないクエリが実行されてしまう攻撃手法です。

  • 例)WHERE 顧客名 = 'X' OR '1'='1' のように書き換えられ、検索条件を無視してすべてのデータを取り出してしまうなど。
  • Accessだと気軽に文字列連結でSQL文を生成したり、フォーム入力をクエリに埋め込んだりしがちで、そのまま外部ユーザーに公開するとリスクになります。

なぜAccessでも危険?

  • フォームで入力されたテキストを文字列連結して strSQL = "SELECT * FROM 顧客 WHERE 名前='" & Me.txt検索 & "'" のようにやると、悪意ある文字列(' OR '1'='1など)を仕込まれる可能性がある。
  • Accessを社内だけで使うケースも多いですが、「複数ユーザーが使う」「VPN経由でも使う」環境では油断できません。

2. 入力チェック(バリデーション)の基本

  1. フォームのBeforeUpdateイベントなどで、数値型に数字以外が入っていないか、文字列に不正文字がないかを確認
  2. 長い文字列や制御文字を弾く(Replace関数で ''' にエスケープなど)
  3. Accessテーブル側のフィールド設定でも必須 (Required)サイズ制限 (Field Size) を行い、過度な文字列を入れさせないようにする

例:SQL用シングルクォートをエスケープ(VBA)

Public Function SafeString(strInput As String) As String
' シングルクォートを '' に置き換え(最低限の対策)
SafeString = Replace(strInput, "'", "''")
End Function
  • 単純な置換ですが、文字列連結するなら必須レベル
  • 本来はパラメータクエリやストアドプロシージャを使うのがベスト

3. パラメータ化クエリの重要性

AccessでSQLインジェクションを根本的に防ぐには、文字列連結でなくパラメータクエリ」を利用する方法が推奨されます。

  • DAO/ADOいずれでも、Parametersを使ってSQLと変数を分離する
  • こうすると、ユーザー入力が文字列連結されず、データベース側で安全に扱われる
ないものはない!お買い物なら楽天市場

3.1 DAOでのパラメータクエリ

クエリの例:AccessクエリデザインでSQL書く

PARAMETERS [顧客名パラメータ] Text ( 50 );
SELECT 顧客ID, 顧客名, 住所
FROM tbl_顧客
WHERE 顧客名 = [顧客名パラメータ];
  • 保存して “qry顧客検索” などの名前を付ける

VBAで実行

Public Sub SearchCustomer(strName As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset

Set db = CurrentDb
Set qdf = db.QueryDefs("qry顧客検索")

' パラメータに値を代入
qdf.Parameters("[顧客名パラメータ]") = strName

Set rs = qdf.OpenRecordset()
If Not (rs.EOF And rs.BOF) Then
' 結果処理
Debug.Print "Hit count: " & rs.RecordCount
End If

rs.Close
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub

メリット

  • ユーザーが X' OR '1'='1 のような入力をしても、SQL文そのものが書き換えられない
  • パラメータが型に基づいて安全に処理される

3.2 ADOでのパラメータ化クエリ

Public Sub SearchCustomerADO(strName As String)
Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset

Set cn = CreateObject("ADODB.Connection")
' DSNレス接続などでOpen
cn.Open "Provider=SQLOLEDB;Data Source=YourServer;Initial Catalog=YourDB;Integrated Security=SSPI;"

Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "SELECT 顧客ID,顧客名 FROM dbo.顧客 WHERE 顧客名 = @pName"
cmd.CommandType = adCmdText

' パラメータ定義
cmd.Parameters.Append cmd.CreateParameter("@pName", adVarWChar, adParamInput, 50, strName)

Set rs = cmd.Execute
If Not (rs.BOF And rs.EOF) Then
Debug.Print "Found: " & rs.RecordCount
End If

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub
  • 同様に文字列連結しないため、SQLインジェクションを防げる

4. 実際のフォーム設計: 安全なデータ更新手順

  1. フォームで入力チェック
    • BeforeUpdateイベントで空欄不正文字がないか確認
  2. パラメータ化クエリでINSERT/UPDATE**
    • 文字列連結ではなくParametersを使用
  3. エラー時
    • On Error構文でエラーをキャッチし、分かりやすいメッセージを出す
  4. テーブルレベルの制約
    • 必須項目やリレーションの参照整合性を設定しておくと、万が一フォーム外で操作があっても安全

5. Access特有の注意点

  1. Accessのクエリデザイン:GUIから入力条件を設定する際、つい文字列連結で "[顧客名] = '" & Me.txtName & "'" と書くパターンに要注意
  2. パラメータクエリ: デザイン画面で [Parameters] を定義しておかないと型が曖昧になる場合あり
  3. VBAエスケープ:シングルクォート ''' の置換は暫定対策。完全には防ぎきれないケースも
  4. DSNレス接続の場合でもパラメータクエリは有効
  5. マクロを使うとき: マクロ内でSQLを記述するときは文字列連結に注意。高度な制御にはやはりVBA推奨

6. まとめ:安全なSQL操作に向けた実践ステップ

  1. 文字列連結を避けよう
    • ユーザー入力をそのまま "..." & Me.txtInput & "..." とSQLへ流すと危険
  2. パラメータ化クエリ or ストアドプロシージャ
    • DAO/ADOのParametersを活用し、入力値をSQLとは独立して扱う
  3. 入力チェック
    • フォームで無効な文字や型を弾き、またテーブル側で必須やバリデーションを設定
  4. エスケープ処理
    • 最低限、シングルクォート ''' に置換するなど
  5. Accessなら大丈夫と思わない
    • 同じPCやLAN内だから安全とは限らず、悪意あるインプットや転用に備える必要がある

本質は「ユーザー入力を何も加工せずSQL文に埋め込むこと」が最も危険だということです。文字列連結が当たり前になっている現場では、パラメータ化クエリへの移行をぜひ検討してください。安全で堅牢なアプリケーションを作ることで、後々のトラブル(データ漏えいや改ざん)を防ぎ、システムの信頼性を高められます。


関連記事

Accessを使ううえでもSQLインジェクションは無縁ではありません。正しい入力チェックパラメータ化クエリを実践し、安全なAccessシステムを構築していきましょう。

DMM
ABOUT ME
まー
まー
駆け出しブロガー
入社した会社では、Accessを活用した基幹システムが長年運用されていました。しかし、開発者の高齢化により保守が困難となり、システムの維持・更新が急務に。 ほぼAccessに触れたことのなかった私は、ゼロから学びながら基幹システムを再構築してみることに。ついにはAccessによるシステム開発エンジニアとしてのスキルを身につけるまでに成長。 元々の業務のノウハウとそれを効率化するためのツール(Access)によって業務効率化システムをいくつも開発してきました。 みなさんの”なにか(業務のノウハウ)”とAccessで業務効率化を実現するお役に立てれば幸いです。 月30万の高配当投資も行っています。最新の銘柄情報もお届けしていきます。
googleアドセンス
記事URLをコピーしました