"sql_quoting": Escaping SQL literals in C
hacker emblem Happy Hacking!


English Here (machine translation)

sql_quoting: SQL 言語の文字列リテラルをエスケープするユーティリティ

この C 言語ユーティリティは、SQL 言語で (特に、動的 SQL を使用する場合に) ホスト言語から渡す文字列データ中の引用符 (' や ")、パターン・マッチ文字 (% や _) をエスケープ処理します。更に MySQL ユーザの場合には制御文字コード ('\n', '\r') もエスケープ処理します。SQL 言語用のエスケープ処理とは、引用符を二重化 (' を '' に、" を "" に) し、パターン・マッチ文字の前にバックスラッシュ文字を挿入し、そして結果の文字列全体を引用符で囲むことを指します。

MS Jet エンジンを使用している場合には、バーティカル・バー | の前にバックスラッシュ文字を挿入できます。

SQL として安全な文字列については、以下のサイトを参考にしました。
IPA/ISEC: SQL組み立て時の引数チェック

API を使用するためのヘッダは sql_quoting.h で、API の実装は sql_quoting.c です。API の説明は、この文書で後述しています。

テスト・プログラム unit_test.c そして make ファイル Makefile を記述しました。


API の説明

  1. SQL 用の文字列エスケープ処理を行う: sql_quoting()
    char *sql_quoting(char                   *src
    , SQL_quoting_qualifier_t qualifier
    , char quote_char
    , char escape_code
    , char *dst
    , size_t dst_sz
    )

    src には SQL エスケープ処理を行う文字列のアドレスを指定します。
    qualifier には SQL エスケープ処理の詳細をビットの論理輪で指定できます。指定できる処理詳細は以下のようになります。

    • SQL_quoting_default:

      デフォルトの処理動作を行います。
      文字列中の引用符 (quote_char と同じ文字コード) は 2 回つづけて出力されます。
      制御文字コード ('\n', '\r') はエスケープ処理しません。
      SQL パターン・マッチ文字 ('%', '_') はエスケープ処理しません。
      出力結果の文字列は引用符文字で囲まれません。

    • SQL_quoting_with_backslash:

      文字列中の引用符をバックスラッシュ文字 '\\' あるいは escape_code に指定された文字でエスケープ処理します。

    • SQL_quoting_escape_control_codes:

      MySQL などを使用している場合に、文字列中の制御文字コード ('\n', '\r') をバックスラッシュ文字あるいは escape_code に指定された文字でエスケープ処理します。

    • SQL_quoting_escape_pattern_codes:

      文字列中の SQL パターン・マッチ文字 ('%', '_') をバックスラッシュ文字あるいは escape_code に指定された文字でエスケープ処理します。

    • SQL_quoting_enclose_result:

      出力文字列を quote_char で指定された引用符文字 (' または ") で囲みます。

    • SQL_quoting_do_not_escape_quots:

      出力文字列を静的な埋め込みSQLに使用する場合に指定します。引用符 (' か ") をエスケープしません。

    • SQL_quoting_escape_vertical_bar:

      MS Jet エンジンを使用 (.MDB 拡張子ファイルを使用している) 場合に垂直バー (|) をエスケープするために指定します。

    quote_char には SQL ステートメントで使用する文字列リテラルの終端文字を一重引用符 ' あるいは二重引用符 " のいずれかで指定します。
    dst にはエスケープ処理の結果文字列を出力するバッファのアドレスを指定します。

    escape_code は qualifier の SQL_quoting_escape_pattern_codes ビットが ON になっている場合に、SQL LIKE 演算子の ESCAPE 句に指定する文字コードを指定します。SQL LIKE 演算パターンマッチ文字 '%' と '_' およびエスケープ文字それ自身の直前に escape_code に指定された文字が挿入されます。qualifier に SQL_quoting_escape_vertical_bar ビットも ON にすると、垂直バー '|' の直前にも escape_code に指定された文字が挿入されます。qualifier の SQL_quoting_escape_pattern_codes ビットが ON になっていて escape_code が nil 文字 '\0' であった場合は、バックスラッシュ文字 '\\' がエスケープ文字になります。指定できる文字コードは '\0', '%', '_', '\'', '"', '|' 以外の文字コード (qualifier の SQL_quoting_escape_vertical_bar ビットが OFF であれば、'|' は指定可能) です。

    dst_sz には dst の指すバッファのサイズを指定します。

    正常終了した場合、dst と同じアドレスが戻り値になります。なんらかのエラーが発生した場合は NULL が戻り値になります。発生したエラーの詳細は以下のように errno に出力されます。

    • EINVAL (= 22) : 不正な引数が渡された場合
    • EMSGSIZE (= 122) : 出力先のバッファ・サイズが不足している場合