Home > 技術 > iBatisで&Parameter&を使うときはSQLインジェクションに気をつけたい

iBatisで&Parameter&を使うときはSQLインジェクションに気をつけたい

iBatisでSQL内にバインド変数(?)を使いたい場合は

EMPLOYEE_ID  = #employeeId:INTEGER#

と記述しますが、これとは別に任意の文字列をiBatis側に渡したい場合があります。
例えばORDER BY句の部分は「EMPLOYEE_ID ASC」といったように文字列を渡せばすごく便利です。
これを実現しているのが

ORDER BY
  $orderByName$   //ここが任意の文字列になる

これは$で囲われた部分に任意の文字列を出力するということになります。
とここで↑で紹介した#employeeId:INTEGER#も$employeeId$と書いてもいいのでは?と疑問になるかもしれませんが、これはSQLインジェクションが発生する原因になってしまいます。
SQLインジェクションとは、DBサーバーへの攻撃手法の一つでデータベース操作用の言語SQLをインジェクション(注入)するという意味です。
例えば

SELECT * FROM USER WHERE EMPLOYEE_ID = ?

というSQLがあった場合に

SELECT * FROM USER WHERE EMPLOYEE_ID = 1;DELETE FROM USER

といったように本来はバインド変数で1だけを渡すはずがDELETE文が埋め込まれてしまう現象を言います。
なかなか恐ろしいSQLですね…
先ほどORDER BY句の部分で紹介した$orderByName$は単なる文字列となるので、上記SQLインジェクションが実現できてしまいます。

※事前にJava側でorderByNameにDELETE文を仕込んどく
orderByName = "1;DELETE FROM USER";

SELECT * FROM USER WHERE EMPLOYEE_ID = $orderByName$

意外と#と$を間違えて混合してしまう場合があるので、十分に注意したいところです。

Trackback:0

TrackBack URL for this entry
http://hisasann.com/cgi-bin/mt/mt-tb.cgi/895
Listed below are links to weblogs that reference
iBatisで&Parameter&を使うときはSQLインジェクションに気をつけたい from HouseTect, JavaScriptな情報をあなたに

Home > 技術 > iBatisで&Parameter&を使うときはSQLインジェクションに気をつけたい

Tag cloud
月別アーカイブ
Powered by
Powered by
Movable Type Commercial 4.261

Page Top