都合の良い暗黙は怖い

暗黙の型変換、楽でエエけど落とし穴も・・・

暗黙の型変換、楽でエエけど落とし穴も・・・

ちょっと調べ物をしていたらデータベースに関する面白い記事を見つけた。趣味の延長線上ではあるが結構前から仕事の一部としてデータベースを触っていて、現在はWindows-Apache-SQLServer-PHPの組み合わせで簡単な文書管理に利用しているのだが、webサービス?に利用しているphpのスクリプトは何年か前に自宅サーバ用にプライベートで作成したいんちきなものを必要なところだけ改変してほぼそのまま利用している。一般的?にスクリプトなど、一旦動くと何らかの変更が無い限り、殆ど手を入れることも無いし、自宅で趣味に使っているものなら、まずそのまま放置が基本である。

何か言いたいのかと言うと、何年もほとんど弄らないスクリプトなど、いざ編集しようとしても自分で書いたにも関わらず中身が理解出来ないくらい殆ど全てキレイさっぱり忘却の彼方に飛び去っているという事である。なので、ちょっと編集しようとすると、文法から関数から全く記憶に存在しないため、ネットでマニュアルやそれについて書かれたサイトを参考に老眼をこすりながらシコシコ作業する必要がある。

で、冒頭のちょっとした調べ物と言うのはまさにその作業の事で、そんな最中に見つけたのがデータベースが持つ「暗黙の型変換」と言う機能に潜む危機である。この機能、かなり乱暴に言うと文字型と数値型を適当に変換してくれると言うもので、例えば、趣味で使っているMySQLでは「1X」は数値「1」として解釈してくれる様やし、「X1」は恐らく文字「X1」として解釈する様だ。実際、前者の例のお陰で助かっている部分もある。

ところが、この便利に見える機能を悪用し、データベースから何らかのレコードを検索取得する処理に「悪意あるSQL」を付加する事でデータを操作する事が出来るらしい。このことをSQLインジェクションと言うのだが、ずいぶん前から言われている話題なのでデータベースを弄くっている人には「今頃何言うとるねん」と言うところやと思う。

もちろん、当方もこのことは知ってはいたのだが実際に試して見る事はなかったので、ちょっと簡単にどんなもんなのか試してみたというのが今回のネタである。一般的にはPHPでスクリプトを書いて試すというのが常道なのかも知れないが、雰囲気だけが判ったらエエやろうと思ったので、マネージメントスタジオ上で実行してみた。

普通の場合はこんな感じ、インジェクションされたらこんな感じ。見事にレコードが削除されております。簡単に説明しておくと、set @param=4 のところは検索条件に数値としての「4」を指定している。次の行にある set @param=’4;delete from T_SMaster’と言うのは検索条件に文字としての「4」に続いて、レコードを消去するSQLを付け加えて指定している。この両者を実行すると、どちらもidxの値が「4」のレコードを返すので問題は無いように見えるが、実は後者の場合は消去が実行されており、T_SMasterテーブルの中には何も残っていない。恐ろしい話である。

なんでidxが3から始まっているか…。疑問に感じたアナタはえらい!目の付け所が違います。観察力がスゴイです。きっと、危険と隣り合わせのお仕事をされているか、元々その方面の才能がある方に違いありません。実は begin tran の入れる位置を間違って本当にレコードが消えてしまったからなのです。あら、恥ずかしやであります。

とは言うものの、実際はプリペアドクエリを使ったり、データベース側で実行権限を管理したりする事でSQLインジェクションは回避する事が出来るのですが、怖いのはどこに穴があるか判らないと言う事であります。プロ中のプロの方々が作成するプログラム、例えばWindowsとか、においても脆弱性対策のパッチが何時までも発行され続けています。もっとも、全然レベルの違う話かも知れませんが、ド素人が遊びや趣味の延長戦上で取り組むときはその点に十分注意する必要があるなぁと感じる今日この頃であります。

Body:Olympus E5
Lenz:ZUIKO ED 50-200 SWD F2.8-3.5
iso:200
ap:3.1
ss:1/6
fl:34(17)mm
eb:0.0

カテゴリー: 生活 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です