SQLインジェクション対策再考

Similar documents
安全なSQLの呼び出し方

WEBシステムのセキュリティ技術

WASF2008

目次 1. エグゼクティブサマリー 総合評価 総評 内在するリスク 情報漏洩 サービス妨害 対策指針 早急の対策 恒久的な対

1. SQL インジェクションの問題と脅威 2

PowerPoint Presentation

MySQL Connector/J における SQL インジェクションの脆弱性

今日こそわかる、安全なWebアプリの作り方2010

SQL インジェクションの脆弱性

講義内容 AppGoat の説明 起動手順 学習の進め方 利用シーン紹介 脆弱性学習 ( 演習あり ) SQLインジェクションの脆弱性 クロスサイト スクリプティングの脆弱性 アンケート記入 2

べきでない悪意のあるSQL 文が攻撃者から入力された場合 データベースで実行される前にSQL 文として処理されないよう無効化する必要がありますが ( 図 1 1) 無効化されずにデータベースで実行された場合 データベースの操作が可能となります ( 図 1 2) 本脆弱性を悪用するとデータベース接続ユ

スライド 0

Microsoft Word - Lab6.doc

MySQL5.0データベース ログファイルおよびステータスの収集

Microsoft Word - Android_SQLite講座_画面800×1280

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

多言語ドメイン名の実装 mdnkit 石曽根信 ( 株 ) SRA 2001/12/04 日本語ドメイン名解説 / mdnkit 1 mdnkit 多言語ドメイン名を扱うためのツールキット 正規化 エンコード変換等を提供するライブラリとコマンド 既存アプリケーシ

PowerPoint プレゼンテーション

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

表 2 michael のパスワード変更後の USER_ACL テーブル内容 リスト2は userpwd プログラムのソースリストである Perl で書かれたプログラムで,DBI インタフェー注ス ( 1 注 ) を使用して MySQL( 2 ) データベースへアクセスする 5 7 行目では, コマ

メール全文検索アプリケーション Sylph-Searcher のご紹介 SRA OSS, Inc. 日本支社技術部チーフエンジニア Sylpheed 開発者 山本博之 Copyright 2007 SRA OSS, Inc. Japan All right

データベースアクセス

早分かりS2Dao

tkk0408nari

情報連携用語彙データベースと連携するデータ設計 作成支援ツール群の試作及び試用並びに概念モデルの構築 ( 神戸市こども家庭局こども企画育成部 千葉市総務局情報経営部業務改革推進課 川口市企画財政部情報政策課 ) データ構造設計支援ツール設計書 2014 年 9 月 30 日 実施企業 : 株式会社ア

プレポスト【問題】

SiteLock操作マニュアル

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

SOC Report

第3回_416.ppt

PowerPoint Presentation

SOC Report

文字コード略歴 よこやままさふみ社内勉強会 2012/05/18 文字コード略歴 Powered by Rabbit 2.0.6

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

Exam : 1z0-882 日本語 (JPN) Title : Oracle Certified Professional, MySQL 5.6 Developer Vendor : Oracle Version : DEMO 1 / 4 Get Latest & Valid 1z0-882-JP

Microsoft PowerPoint - ruby_instruction.ppt

Android Layout SDK プログラミング マニュアル

Microsoft Word 基_シラバス.doc

Si 知識情報処理

Microsoft Word - JDBCドラバーの設定.doc

intra-mart Accel Platform — TableMaintenance ユーザ操作ガイド   第7版   None

5-2. 顧客情報をエクスポートする 顧客管理へのアクセス手順 メールディーラーで管理する顧客情報に関する設定を行います 1. 画面右上の 管理設定 をクリックする 2. 管理設定 をクリックする 3. ( タブ ) 顧客管理 をクリックする 2

SOC Report

intra-mart FormatCreator Version6.1

本当はこわいエンコーディングの話 とみたまさひろ 東京 Ruby 会議 本当はこわいエンコーディングの話 Powered by Rabbit 2.0.6

Microsoft PowerPoint - char-1605temp.ppt [互換モード]

Microsoft認定資格問題集(70-483_demo)

johokiso-char.pdf.pdf

intra-mart Accel Platform — TableMaintenance ユーザ操作ガイド   第8版  

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

2003年度 情報処理概論

XAMPP で CMS のお手軽 テスト環境を手に入れよう 2011/5/21 上村崇 1

SOC Report

4-4- 基スクリプト言語に関する知識 コードの作成や修正が容易とされるスクリプト言語を学習し アプリケーション開発の手法を習得する 本カリキュラムでは まずスクリプト言語に位置づけされる Perl PHP Python JavaScript Ruby といった Ⅰ. 概要プログラミング言語の特徴に

Informatica Cloud Connectors - Spring リリースノート - (Japanese)

対象 ポイント 対象 企業等のウェブサイト公開における安全性向上について理解を深めたい方 ポイント 主に企業ウェブに関連したセキュリティ事故のケーススタディによる脅威と対策の技術的解説 Copyright 2008 独立行政法人情報処理推進機構 2

いまさら聞けない日本語ドメイン名

Java 入門 6 Java 入門 6 - データベースにアクセスする Version 1.0 Kyosuke Yanai Copyright(c) 2010 Kyosuke Yanai

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

5. オープンソースWAF「ModSecurity」導入事例 ~ IPA はこう考えた ~

1013  動的解析によるBOTコマンドの自動抽出

Apache-Tomcat と 冗長な UTF-8 表現 (CVE 検証レポート ) 2008 年 08 月 26 日 Ver. 0.1

MySQL Cluster

情報システム設計論II ユーザインタフェース(1)

Microsoft Word - PHP_SQLServer2012

Microsoft PowerPoint - myadmin.ppt

VB実用Ⅲ⑩ フリーデータベースⅡ

開発・運用時のガイド JDK8への移行に伴う留意点 [UNIX]

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

ITdumpsFree Get free valid exam dumps and pass your exam test with confidence

10th Developer Camp - B5

1 ex01.sql ex01.sql ; user_id from (select user_id ;) user_id * select select (3+4)*7, SIN(PI()/2) ; (1) select < > from < > ; :, * user_id user_name

(Microsoft PowerPoint -

スケジューリングおよび通知フォーム のカスタマイズ

(Microsoft PowerPoint - WQ21JDEadapter\215\\\220\254\216\350\217\207\217\221_ ppt)

本チュートリアルについて 14 部構成 比較的簡単なトピックから 各回 プログラミング言語 任意 チュートリアルで 新しい内容 宿題 プログラミング演習 次の週 結果について発表 もしくは話し合いをする スライドは Python で Python, C++, Java, Perl についての質問い答

Microsoft Word - tutorial3-dbreverse.docx

SQLインジェクション・ワームに関する現状と推奨する対策案

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 文字列 文字列リテラル プログラムの中で文字列を表す方法は幾つか有るが 基本的な方法は下記の 2 種で有る 対象と成る文字の集まりをダブルクオーテーション ( " ) で囲うか シングルクオーテーション ( ' ) で囲う PYTHON3 "

アプリケーション インスペクションの特別なアクション(インスペクション ポリシー マップ)

SOC Report

モバイルアプリを Azure で作る - データを扱う Azure Storage を利 してデータを保存する 本稿では PHP と Windows Azure を使って 画像などのファイルを扱うアプリケーションを開発する方法を説明します Windows Azure Platform では データの

Oracle、MS Access または SQL DB と CVP スタンドアロン配備を統合方法

Oracle SQL Developer Data Modeler

OpenRulesモジュール

Microsoft Word - Lab5d-DB2組み込みSQL.doc

SOC Report

関係データベース

Nucleus CMS 4.0 の新機能 日本語版リリースマネジャー兼メインコミッター坂本貴史

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

AquesTalk Mac マニュアル

iNFUSE インフューズ

HULFT-DataMagic for Windows Ver レベルアップ詳細情報 < 製品一覧 > 製品名 バージョン HULFT-DataMagic for Windows HULFT-DataMagic コード変換 オプション for Windows HU

メソッドのまとめ

ADempiere (3.5)

Microsoft Word - JDBC検証 docx

intra-mart EX申請システム version.5.4 提出依頼機能 リリースノート

PowerPoint Presentation

MySQL 日本語処理完全解説 住商情報システム株式会社プラットフォームソリューション事業部門 IT 基盤ソリューション事業部オープンソースシステム部玉川修一 1

Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

Transcription:

安全な SQL の呼び出し方 HASH コンサルティング株式会社徳丸浩 Twitter id: @ockeghem 1

アジェンダ 1. リテラルと SQL インジェクション 2.SQL の呼び出し方 3. データベースと連動した SQL 文生成 4.DBMS 製品の実態調査 付録 A. 技術情報 Copyright 2012 HASH Consulting Corp. 2

1. リテラルと SQL インジェクション Copyright 2012 HASH Consulting Corp. 3

SQL 文の構成要素 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html Copyright 2012 HASH Consulting Corp. 4

リテラルとは 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html 5

文字列リテラルのエスケープと SQL インジェクション 以下の SQL SELECT * FROM employee WHERE name = '$name' O'Reilly を検索したい場合 単に文字列連結でパラメータとして与えると以下のように Reilly がリテラルをはみ出す SELECT * FROM employee WHERE name = 'O'Reilly' はみ出した部分は SQL 文として意味をなさないのでエラーになるが エラーにならないように入力を調整することも可能 これが SQL インジェクション $name = "';DELETE FROM employee--" とした場合 SQL 文は以下となる SELECT * FROM employee WHERE name = '';DELETE FROM employee--' リテラルをはみだすことを防ぐには 以下のようにシングルクォートを重ねる SELECT * FROM employee WHERE name = 'O''Reilly' Copyright 2012 HASH Consulting Corp. 6

数値リテラルのエスケープと SQL インジェクション 以下の SQL について $id は整数型 SELECT * FROM employee WHERE id = $id $id="123abc" とすると abc の部分が数値リテラルから はみ出す SELECT * FROM employee WHERE id = 123abc はみ出した部分は SQL 文として意味をなさないのでエラーになるが エラーにならないように入力を調整することも可能 これが SQL インジェクション $id= "1;DELETE FROM employee" とした場合 SQL 文は以下となる SELECT * FROM employee WHERE id = 1;DELETE FROM employee リテラルをはみだすことを防ぐには 数値リテラルであることを確実にする バリデーションあるいは整数へのキャスト SELECT * FROM employee WHERE name = 1 Copyright 2012 HASH Consulting Corp. 7

2.SQL の呼び出し方 Copyright 2012 HASH Consulting Corp. 8

SQL の呼び出し方 SQL に動的なパラメータを埋め込む方法には 2 種類ある (1) 文字列連結による SQL 文組み立て $name =...; $sql = "SELECT * FROM employee WHERE name='". $name. "'"; $name をエスケープしていないので SQL インジェクション脆弱性あり (2) プレースホルダによる SQL 文組み立て PreparedStatement prep = onn.preparestatement( "SELECT * FROM employee WHERE name=?"); prep.setstring(1, " 山田 "); プレースホルダには 2 種類ある ( 静的 動的 ) Copyright 2012 HASH Consulting Corp. 9

静的プレースホルダ 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html SQL とパラメータは別々にサーバーに送られる パラメータ抜きで SQL は構文解析される パラメータは後から割り当てられる SQL インジェクション脆弱性の可能性が原理的になくなる Copyright 2012 HASH Consulting Corp. 10

動的プレースホルダ 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html SQL とパラメータは呼び出し側で エスケープ 連結される データベースサーバー側は 組み立てられた文字列を SQL として実行するだけ ライブラリにバグがなければ SQL インジェクション脆弱性は発生しない Copyright 2012 HASH Consulting Corp. 11

SQL の組み立て方と SQL インジェクションの可能性の関係 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html 文字列連結による組み立ては アプリケーション開発者の無知や不注意により SQL インジェクション脆弱性の可能性がある 動的プレースホルダは ライブラリのバグにより SQL インジェクション脆弱性の可能性がある 静的プレースホルダは原理的に SQL インジェクション脆弱性の可能性がない Copyright 2012 HASH Consulting Corp. 12

3. データベースと連動した SQL 文生成 Copyright 2012 HASH Consulting Corp. 13

文字列連結による SQL 組み立てを安全に行うには 文字列連結による SQL 組み立て時のパラメータの要件 文字列リテラルに対しては エスケープすべき文字をエスケープすること 数値リテラルに対しては 数値以外の文字を混入させないこと 意外に面倒 データベースによってエスケープすべきメタ文字が異なる オプションによってもエスケープすべきメタ文字が異なる Perl PHP 等では quote メソッドが便利 Perl DBI PHP Pear::MDB2 PDO quote メソッドはデータベースの種類や設定に応じたエスケープをしてくれる はず 例外 ( バグ? 仕様?) もある Copyright 2012 HASH Consulting Corp. 14

文字列リテラルのエスケープ どの文字をエスケープするのか? SQL 製品の文字列リテラルのルールに従う ISO 標準では ' '' MySQL と PostgreSQL は ' '' NO_BACKSLASH_ESCAPES=on の場合は ISO 標準と同じ方法になる PostgreSQL の場合は standard_conforming_strings および backslash_quote の影響を受ける standard_conforming_strings=on の場合は ISO 標準と同じ方法になる PostgreSQL9.1 以降で standard_conforming_strings=on がデフォルトに backslash_quote の場合は ' ' というエスケープがエラーになる 元の文字エスケープ後 Oracle MS SQL IBM DB2 MySQL PostgreSQL または ( を推奨 ) Copyright 2012 HASH Consulting Corp. 15

MySQL と PostgreSQL で のエスケープが必要な理由 SELECT * FROM XXX WHERE ID='$id' $id として 'or 1=1# が入力されると 'or 1=1# エスケープ ( のエスケープをしない場合 ) ''or 1=1# 元の SQL に適用すると SELECT * FROM XXX WHERE ID=' '' or 1=1#' すなわち SQL の構文が改変された ( で 一文字と見なされる ) Copyright 2012 HASH Consulting Corp. 16

quote メソッドの詳細 PHP の Pear::MDB2 における quote の呼び出し require_once MDB2.php ; // ライブラリのロード // DB への接続 (PostgreSQL の場合 ) $db = MDB2::connect('pgsql://dbuser:password@hostname/dbname?charset=utf8'); // 文字列型を指定して 文字列リテラルのクォート済み文字列を得る ( 略 )$db->quote($s, 'text') ( 略 ) // 数値型を指定して 数値リテラルの文字列を得る ( 略 )$db->quote($n, 'decimal') ( 略 ) データ 型指定 戻り値 abc 'text' 'abc' (PHPの文字列型の値 クォートを含む) O'Reilly 'text' O''Reilly' (PHPの文字列型の値 クォートを含む) -123 'decimal' -123 (PHPの文字列型の値) 123abc 'decimal' 123 (PHPの文字列型の値) -123 'integer' -123 (PHPの整数型の値) 123abc 'integer' 123 (PHPの整数型の値) 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html Copyright 2012 HASH Consulting Corp. 17

quote メソッドの数値データの処理結果 Perl DBI/DBD PHP の PDO, Pear::MDB2 で quote の処理内容を調査 1a ' を INTEGER 型を指定して quote すると どうなるか? サンプルスクリプト : DBI: $dbh->quote("1a '", SQL_INTEGER) PDO: $dbh->quote("1a '", PDO::PARAM_INT) MDB2: $dbh->quote("1a '", 'integer') モジュール名結果 DBI(DBD::mysql) 1a ' DBI(DBD::PgPP) '1a '' PDO '1a '' MDB2 1(int 型 ) なにもしていない!( 脆弱性 ) 正しい結果 quote メソッドに期待したが 現状 SQL の仕様通り動作するのは MDB2 のみ プレースホルダの利用を推奨 Copyright 2012 HASH Consulting Corp. 18

4.DBMS 製品の実態調査 Copyright 2012 HASH Consulting Corp. 19

Java + Oracle の場合 項目プレースホルダの実装動的プレースホルダのエスケープ処理 quoteメソッドの処理文字エンコーディングの扱い 調査結果 静的プレースホルダのみ 調査対象外 ( 動的プレースホルダは提供されていない ) 調査対象外 (quote メソッドは提供されていない ) DB 接続には UTF-8 が使用される Java + Oracle + ojdbc6.jar では 常に静的プレースホルダが使用されるため Java の PreparedStatement インターフェースを使っている限り 注意点はありません Java では quote メソッドに該当するライブラリが提供されておらず データベースエンジンの種類や設定に連動したエスケープ処理ができないため 文字列連結による SQL 文の組み立ては推奨されません 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html 20

PHP + PostgreSQL の場合 下記の点から PEAR::MDB2 について調査しました MDB2 は PostgreSQL の他 MySQL Oracle 等の複数の DBMS に対して SQL 呼び出しを抽象化したインターフェースを提供している Pear::DB Pear::MDB などの同種のモジュールは既に開発が終了しているのに対し MDB2 は開発が継続されている 文字エンコーディングを考慮している 静的プレースホルダを利用できる プレースホルダへの値のバインドとクォートの際に データの型を考慮している 項目 プレースホルダの実装 動的プレースホルダのエスケープ処理 調査結果 静的プレースホルダのみ quote メソッドの処理 ( 文字列リテラルの生成 ) 正しく処理される quote メソッドの処理 ( 数値リテラルの生成 ) 文字エンコーディングの扱い 調査対象外 ( 動的プレースホルダは提供されていない ) 正しく処理される DB 接続時に文字エンコーディングを指定できる PHP + MDB2 + PostgreSQL の組み合わせでは 常に静的プレースホルダが使用されるため プレースホルダを使っている限り 注意点はありません プレースホルダの代わりに quote メソッドを使うことも可能で quote メソッドは 文字列リテラル 数値リテラルともに 正しく生成します 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html 21

Perl + MySQL の場合 (DBI + DBD::MySQL) 項目 プレースホルダの実装 動的プレースホルダのエスケープ処理 quote メソッドの処理 ( 文字列リテラルの生成 ) 調査結果 動的プレースホルダまたは静的プレースホルダ 正しく処理される 正しく処理される quote メソッドの処理 ( 数値リテラルの生成 ) 正しく処理されない ( 入力をそのまま返す ) 文字エンコーディングの扱い DB 接続時に UTF-8 を明示的に指定できる MySQL で静的プレースホルダを使用する場合 mysql_server_prepare=1 を指定すること エスケープ対象の文字は NO_BACKSLASH_ESCAPES を正しく反映する 数値に対して quote メソッドは何もしない ( 脆弱性!) mysql_enable_utf8=1 により UTF-8 を明示できる $dbh->quote("1 or 1=1", SQL_INTEGER); # "1 or 1=1" を返す 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html 22

Java + MySQL の場合 (MySQL Connector/J) 項目 プレースホルダの実装 動的プレースホルダのエスケープ処理 quote メソッドの処理 文字エンコーディングの扱い 調査結果 動的プレースホルダまたは静的プレースホルダ 正しく処理される ( ただし バージョンによっては付録 A.3 の問題がある ) 調査対象外 (quote メソッドは提供されていない ) DB 接続時に文字エンコーディングを指定できる 静的プレースホルダを使用するためには useserverprepstmts=true を指定する 動的プレースホルダを使用する場合 NO_BACKSLASH_ESCAPES を反映したエスケープを行う DB 接続時に characterencoding パラメータにより文字エンコーディングの指定が可能 独立行政法人情報処理推進機構 安全な SQL の呼び出し方 より引用 http://www.ipa.go.jp/security/vuln/websecurity.html 23

付録 A. 技術情報 Copyright 2012 HASH Consulting Corp. 24

文字コードの問題 1 5C 問題による SQL インジェクション 5C 問題とは Shift_JIS 文字の 2 バイト目に 0x5C が来る文字に起因する問題ソ 表 能 欺 申 暴 十 など出現頻度の高い文字が多い 0x5C が ASCII ではバックスラッシュであり ISO-8859-1 など 1 バイト文字と解釈された場合 日本語の 1 バイトがバックスラッシュとして取り扱われる 一貫して 1 バイト文字として取り扱われれば脆弱性にならないが 1 バイト文字として取り扱われる場合と Shift_JIS として取り扱われる場合が混在すると脆弱性が発生する Copyright 2012 HASH Consulting Corp. 25

ソースコード ( 要点のみ ) <?php header('content-type: text/html; charset=shift_jis'); $key = @$_GET['name']; if (! mb_check_encoding($key, 'Shift_JIS')) { die(' 文字エンコーディングが不正です '); } // MySQLに接続 (PDO) $dbh = new PDO('mysql:host=localhost;dbname=books', 'phpcon', 'pass1'); // Shift_JISを指定 $dbh->query("set NAMES sjis"); // プレースホルダによるSQLインジェクション対策 $sth = $dbh->prepare("select * FROM books WHERE author=?"); $sth->setfetchmode(pdo::fetch_num); // バインドとクエリ実行 $sth->execute(array($key));?> Copyright 2012 HASH Consulting Corp. 26

5C 問題による SQL インジェクションの説明 Copyright 2012 HASH Consulting Corp. 27

対策 文字エンコーディング指定のできるデータベース接続ライブラリを選定し 文字エンコーディングを正しく指定する $dbh = new PDO('mysql:host=xxxx;dbname=xxxx;charset=cp932', 'user', 'pass', array( PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/mysql/my.cnf', PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => 'client', )); # http://gist.github.com/459499 より引用 (by id:nihen) 静的プレースホルダを使うよう指定する あるいはプログラミングする $dbh->setattribute(pdo::attr_emulate_prepares, false); 詳しくは 安全な SQL の呼び出し方 を参照 http://www.ipa.go.jp/security/vuln/websecurity.html Copyright 2012 HASH Consulting Corp. 28

文字コードの問題 2 U+00A5 による SQL インジェクション Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/books?user=phpcon&passw ord=pass1"); String sql = "SELECT * FROM books where author=?"; // プレースホルダ利用による SQL インジェクション対策 PreparedStatement stmt = con.preparestatement(sql); //? の場所に値を埋め込む ( バインド ) stmt.setstring(1, key); ResultSet rs = stmt.executequery(); // クエリの実行 Copyright 2012 HASH Consulting Corp. 29

U+00A5 による SQL インジェクションの原理 IPA: 安全な SQL の呼び出し方 (http://www.ipa.go.jp/security/vuln/websecurity.html) より引用 30

U+00A5 による SQL インジェクションの条件と対策 脆弱性が発生する条件 JDBC として MySQL Connector/J 5.1.7 以前を使用 MySQL との接続に Shift_JIS あるいは EUC-JP を使用 静的プレースホルダを使わず エスケープあるいは動的プレースホルダ ( クライアントサイドのバインド機構 ) を利用している 対策 ( どれか一つで対策になるがすべて実施を推奨 ) MySQL Connector/J の最新版を利用する MySQL との接続に使用する文字エンコーディングとして Unicode(UTF-8) を指定する ( 接続文字列に characterencoding=utf8 を指定する ) 静的プレースホルダを使用する ( 接続文字列に useserverprepstmts=true を指定する ) Copyright 2012 HASH Consulting Corp. 31

SQL インジェクション対策 入力値 文字エンコーディングの検証 and/or 文字エンコーディングの変換 要件に従った入力値の検証 ( 制御文字のチェックは必須 ) SQL 呼び出し ともかくプレースホルダを使うこと 静的プレースホルダの利用が 原理的に 安全 安全な SQL の呼び出し方 をよく読む 文字コードの選定 アプリケーションを通して Unicode を使う HTTP メッセージは UTF-8 アプリケーションの内部は UTF-8 か UTF-16 ケータイ向けサイトは HTTP メッセージの文字エンコーディングを Shift_JIS にするが 内部は UTF-8 とする EUC-JP という選択もあり得るが 使える言語が少ない 円記号 U-00A5 バックスラッシュ (5C) の変換に注意 尾骶骨テストのすすめ Copyright 2012 HASH Consulting Corp. 32