m moji kit v1.0.9
''
エンコード

SQL エスケープ

SQL 標準の文字列リテラルエスケープを行います (シングルクォート ' を '' に変換)。表示 / 記録目的のための処理で、ユーザー入力を SQL に組み立てる際は必ずプレースホルダ (パラメータ化クエリ) を使ってください。SQLi 対策にはなりません。

サンプル

こんなときに使う

SQL のサンプルをドキュメントに貼る

ブログ記事に「SELECT * FROM users WHERE name = 'O''Brien'」のような SQL を載せたいとき、内部のシングルクォートをエスケープ。

ログに SQL をそのまま記録

アプリログに SQL を残すとき、文字列リテラル内のクォートをエスケープして、貼り戻すと再実行可能な形にしておきます。

DB マイグレーション SQL を手作業で書く

INSERT 文に文字列値を埋め込む際、シングルクォートを含む人名(O'Brien など)を正しく書きます。

テストデータの SQL ダンプを作る

テスト用 INSERT 文を量産するとき、CSV から取り込んだ値の ' をエスケープ。

ストアドプロシージャ内の動的 SQL を確認

EXEC / sp_executesql で構築している SQL を再現するときの値表示。実装を見直してプレースホルダ化する判断材料に。

アンエスケープして元の文字列を取り出す

ログから取り出した SQL 文字列リテラルを、データ値として扱うために '' を ' に戻す処理。

よくあるエラーと対処

ERR エスケープしただけで SQLi が防げると思った
原因
シングルクォートのエスケープだけでは、コメント (--) や別の構造(型キャスト等)を使った攻撃が成立する可能性があります。
対処
プレースホルダ(パラメータ化クエリ)を使ってください。例: PostgreSQL の `$1`、MySQL の `?`、Python の psycopg2 の `%s`。
ERR MySQL で動かない(バックスラッシュ問題)
原因
MySQL は NO_BACKSLASH_ESCAPES が無効だと \' でもエスケープになります。SQL 標準とは異なります。
対処
MySQL では mysql_real_escape_string などライブラリ関数を使ってください。本ツールは SQL 標準('' のみ)です。
ERR アイデンティファイア(テーブル名 / カラム名)に使えない
原因
テーブル名・カラム名は文字列リテラルではなく識別子で、エスケープルールが違います(PostgreSQL は ", MySQL は `)。
対処
識別子のエスケープには別の手段を使ってください。本ツールは文字列値のみ。
ERR Unicode 制御文字や NULL バイトを含む値
原因
DB によっては NULL バイトを許容しません。
対処
事前にバイト列を確認・除去してください。本ツールはシングルクォートしか扱いません。

CLI / 他言語でやる方法

PostgreSQL psql
psql -c "SELECT quote_literal('O''Brien')"

quote_literal は SQL 用エスケープ + クォート。E'...' リテラルも併用。

MySQL mysql_real_escape_string
mysql_real_escape_string($conn, $value)

PHP の MySQL 拡張から。MySQL の方言を考慮。

Python psycopg2
cur.execute('SELECT * FROM t WHERE a = %s', (value,))

プレースホルダを使う正攻法。手動エスケープしない。

よくある質問

プレースホルダを使えば本ツールは不要?
アプリでは不要です。本ツールは表示・ログ・サンプル提示などの「人が読む SQL を整える」用途です。
シングルクォート以外のエスケープは必要?
SQL 標準では ' のみ。MySQL や一部 DB はバックスラッシュも特別扱いするモードがあります。SQL Server は標準準拠で ' のみです。
コメント (--) の混入を防ぐには?
プレースホルダで完全に防げます。手で組み立てる場合は -- や /* */ を含む値を許容しないバリデーション層が必要です。
PostgreSQL の dollar quoting は?
$$...$$ で囲むエスケープ不要のリテラル形式があります。動的に生成された SQL より、リテラルの SQL を書くときに便利です。
ORM を使えばエスケープは不要?
ほとんどの ORM はパラメータ化クエリを内部で使うので安全です。raw query / 生 SQL を発行する API を使う場合のみ手動エスケープが必要。
LIKE 句のワイルドカード(% _)はどうする?
値として % や _ を含めたい場合、LIKE 用の追加エスケープが必要です。SQL: `LIKE 'foo\%' ESCAPE '\'`。本ツールはリテラルエスケープのみで、LIKE エスケープは行いません。
Unicode 文字はエスケープされる?
本ツールでは ' しかエスケープしません。Unicode 文字はそのまま通します。DB 側の文字コード設定(UTF-8 など)に従って正しく保存されます。
サーバーに送信されますか?
送信されません。ブラウザ内で完結します。機密 SQL も安心。

関連ツール