| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
2007-06-14 変数に型のない言語におけるSQLインジェクション対策に対する考察(4)
●SQLの「暗黙の型変換」で実行速度が遅くなるのはどのような場合か
数値リテラルをシングルクォートで囲むことの是非にて、「変数に型のない言語」(Perl、PHP、Rubyなど)で数値項目に対するSQLインジェクション対策について検討した。その際に、数値リテラルを文字列リテラルとしてシングルクォートで囲む(中の値はエスケープする)という方法を紹介した上で、文字列型から数値型への「暗黙の型変換」により、SQLの実行が遅くなる可能性を指摘した。
この情報は、ネット上で検索すればすぐに見つかるものであるが、私自身試したことはなかった(なにせ暗黙の型変換などやりたくないクチなので)。
しかし、実験もせずに「SQLの暗黙の型変換はパフォーマンスが劣化する」と断言するのもエンジニアとしてどうかと思い、簡単なサンプルで実験を行ってみた。
実験には、Oracle Database 10g Express Editionを使用して、TKPROFユーティリティにより測定を行った。ただし、データ量が1万件しかないので実行速度については有意な差が出なかったので、インデックスの利用有無により間接的な判定を行った。
結論から言えば、SQLインジェクション対策時に発生する「暗黙の型変換」については、パフォーマンスは低下しないようである。
「暗黙の型変換」でパフォーマンスが低下する場合は確かに検証できたが、
文字列型の列と数値リテラルに対する演算
の場合であった。具体的には、以下のような場合である(DOC_IDは文字列型とする)。
SELECT * FROM HOGE WHERE DOC_ID = 123
この場合、すべてのDOC_IDを数値に変換しながらWHERE句が実行されるため、インデックスを使用することができずにパフォーマンスが低下する。
一方、DOC_NIDが整数型だとして、
SELECT * FROM HOGE WHERE DOC_NID = '123'
の場合は、まず'123'を整数型に変換してから検索実行されるので、インデックスが有効活用される。すなわち、パフォーマンス低下はない。
SQLインジェクション対策にあらわれる「暗黙の型変換」は後者のパターンであるため、SQLインジェクション対策に限って言えば、パフォーマンス低下は認められなかった。
しかしながら、このような実験を行うとともに、この問題に対する考察を深めた結果、やはり数値リテラルをシングルクォートで囲むというやり方には問題があると思う。その内容については稿をあらためて説明したい。
数値項目に対するSQLインジェクション対策について検討しました。数値をクォートしてエスケープする方法は副作用が多く、SQL組み立て時に数値チェックを行う方法を推奨します。
- http://d.hatena.ne.jp/ockeghem/ ×34
- http://d.hatena.ne.jp/ockeghem/20070528 ×28
- http://d.hatena.ne.jp/ockeghem/20070502/1178042280... ×15
- http://a.hatena.ne.jp/ockeghem/ ×15
- http://www.tokumaru.org/ ×13
- http://www.tokumaru.org/d/20080502.html ×10
- http://www.tokumaru.org/was/ ×8
- http://www.math.sansu.org/u/diary/ ×5
- http://d.hatena.ne.jp/hnw/20070530 ×5
- http://www.tokumaru.org/d/20070924.html ×5
- http://d.hatena.ne.jp/ockeghem/20070502 ×4
- http://www.cubed-l.org/cgi/freshreader/feedshowall... ×3
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=DB... ×3
- http://nogue.cocolog-nifty.com/diary/2007/05/refiz... ×3
- http://d.hatena.ne.jp/ockeghem/20070528/1180387214... ×3
- http://reader.livedoor.com/reader/ ×2
- http://www.math.sansu.org/u/diary/?date=20070604 ×2
- http://b.hatena.ne.jp/cubed-l/20070615 ×2
- http://www.tokumaru.org/index.htm ×2
- http://d.hatena.ne.jp/niha/edit?date=20070626 ×2
- http://d.hatena.ne.jp/housai/edit?date=20070611 ×2
- http://pc.matome.jp/keyword/ワンライナー ×2
- http://d.hatena.ne.jp/niha/20070626 ×2
- http://209.85.175.104/search?q=cache:kfGvCpbCmtwJ:... ×2
- http://d.hatena.ne.jp/housai/20060814/1155563944 ×1
- http://nogue.cocolog-nifty.com/ ×1
- http://www.math.sansu.org/u/diary/?date=20070529 ×1
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×1
- http://b.hatena.ne.jp/cubed-l/プログラミング/?mode=detail... ×1
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=SQ... ×1
- http://b.hatena.ne.jp/cubed-l/プログラミング/ ×1
- http://search.live.com/results.aspx?srch=106&q=数値か... ×1
- http://people.matome.jp/tag/徳丸 ×1
- http://209.85.141.104/search?q=cache:kfGvCpbCmtwJ:... ×1
- http://search.live.com/spresults.aspx?q=データ型変換 SQL... ×1
- http://www.moneylending-navi.com/クレジットカード キャッシング/ ×1
- http://search.live.com/results.aspx?q=暗黙の型変換 Oracl... ×1
- http://d.hatena.ne.jp/hnw/?of=5 ×1
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=エン... ×1
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=My... ×1
- http://nogue.cocolog-nifty.com/diary/2007/06/2_489... ×1
- http://reader.livedoor.com/subscribe/http://www.to... ×1
- http://www.deaikei-site.net/出会い系サイト結婚相談所/ ×1
- http://b.hatena.ne.jp/entry/4631574 ×1
- http://b.hatena.ne.jp/omaya/ ×1
- http://search.live.com/results.aspx?q=T-SQL 型変換&fo... ×1
- http://search.live.com/results.aspx?q=SQL 型変換&form... ×1
- http://pc.matome.jp/keyword/オブジェクト指向 ×1
- http://a.hatena.ne.jp/ikepyon/ ×1
- http://d.hatena.ne.jp/housai/20070525/1180109645 ×1
- http://d.hatena.ne.jp/ockeghem/searchdiary?word=Pa... ×1
- http://tokumaru.org/was/ ×1
- http://search.live.com/results.aspx?q=sql 数値型へ&src... ×1
- http://search.live.com/results.aspx?q=SQL select 型... ×1
- SQL 暗黙の型変換 ×12 / キーワード不明 ×12 / sql 暗黙の型変換 ×8 / SQL 暗黙 型変換 ×6 / sql 数値型 囲む ×5 / SQL 暗黙の型変換 パフォーマンス ×5 / IEEE754 ×5 / sql 型変換 ×4 / SQL 型変換 ×4 / oracle 暗黙の型変換 ×4 / SQLインジェクション 実験 ×3 / sql 暗黙型変換 ×3 / php 固定小数点 ×2 / 暗黙の型変換 sql ×2 / Oracle WHERE句 数値型 クォート ×2 / コンパイラ エンジニア ×2 / ケチ 表現 2進数 ×2 / sql 文字列 数字 囲む ×2 / oracle エスケープ シングルクォート ×2 / 暗黙の型変換 Oracle ×2 / ruby SQL 変換 ×2 / JScript 数値型へ 型変換 ×2 / Oracle 暗黙の型変換 ×2 / SQL シングルクォート について ×2 / SQL インジェクション対策 サンプル ×2 / 暗黙の型変換 インデックス ×2 / oracle 10g 暗黙の型変換 ×2 / sql 数値 文字列 速度 ×2 / 型変換 速度 SQL ×2 / 変数 型のない SQLインジェクション ×2 / DB 暗黙 型変換 パフォーマンス ×2 / SQLインジェクション 対策 ×2 / hnw round ×1 / サニタイズ sql perl ×1 / SQLインジェクション やり方 ×1 / php 整数 上限 ×1 / php MSSQL サンプル エスケープ ×1 / ruby SQLインジェクション ×1 / SQLインジェクション エスケープ 対策 oracle ×1 / sql 型変換 暗黙 速度 ×1 / 3の倍数 判定 ビット ×1 / oracle INDEX 暗黙の型変換 ×1 / 型変換 処理速度 ×1 / oracle SQLインジェクション 対策方法 ×1 / sql インジェクション ruby 対策 ×1 / sql 数値型 変換 ×1 / sql インデックス パフォーマンス低下 ×1 / oracle 文字 数値 暗黙 速度 ×1 / Oracle 10g 型変換 暗黙 ×1 / tkprof パターン ×1 / 型変換 パフォーマンス Oracle ×1 / sql 速度 ×1 / SQL 処理速度対策 ×1 / SQL 型 変換 方法 ×1 / SQL 暗黙型変換 ×1 / SQLServer SQLインジェクション対策 ×1 / php oracle 10g シングルクォート ×1 / perl 数値 文字 型変換 ×1 / perl 変数 上限 有効桁数 ×1 / sql 文字列リテラル 変換 ×1 / sql 整数 型変換 ×1 / php SQLSERVER エスケープ サンプル ×1 / FizzBuzz ワナ ×1 / SQLインジェクション 対策 変数 ×1 / プログラマ テスト Fizz ×1 / 数値 暗黙 変換 文字列 sql ×1 / 暗黙の型変換 oracle ×1 / oracle サニタイズ ×1 / 暗黙 型変換 Oracle ×1 / sql 型変換 整数 ×1 / prel xss対策 ×1 / fizzbuzz ×1 / sql 変換 パフォーマンス ×1 / 暗黙 型変換 インデックス ×1 / 暗黙の型変換 速度 ×1 / ruby sqlインジェクション対策 ×1 / 暗黙の型変換 実行速度 ×1 / sql where文 数値比較 ×1 / ruby mail rss 変換 ×1 / SQL Server 文字列 型変換 ×1 / oracle 数値 文字列 パフォーマンス ×1 / 徳丸 浩 ×1 / 暗黙 型変換 SQL ×1 / sql injection 対策 perl ×1 / perl SQLインジェクション 対策 ×1 / sql server シングルクォート ×1 / IEEE754 指数部 仮数部 ケチ ×1 / sql 数値 囲む ×1 / sql injection 対策 ruby ×1 / ieee754 ×1 / SQLインジェクション対策 PHP サンプル ×1 / sql 列 型変換 ×1 / sql 暗黙変換 ×1 / FizzBuzz php ×1 / perl sqlインジェクション ×1 / SQL 列 型変換 ×1 / SQL 暗黙 変換 ×1 / SQLインジェクション FORM ×1 / SQL 変数 遅くなる ×1 / sql 変数 型 変換 ×1
| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |