2008/03/12

終端文字のようなセミコロンの話

SQLの終端文字のようなセミコロン。

Oracleではどうやらシステム変数で変更できちゃうみたいだし(デフォルト=セミコロンというだけの話なのねー)、どうやら標準SQLではないというのはなんだか衝撃でした。ものの本では大抵、終端文字然としてSQLの文末には「;」がありますからねー。

で、このセミコロンの話をS師匠と話していたところ、「そうだよ、だから.Netで書くときはパラメーターでイチイチ定義する書き方もやっているんだよ」と云われて、そういえば、DB絡みのクラスを書きはじめた当時、そんなようなことを云われたなー、ということを思い出しました。

アプリを作る際には、SQLのWHERE部分に対して、変数なりで条件を受け渡します。検索画面であったりするなら、テキストボックスで知りたい値を入力するわけですが、その際「0;DELETE FROM TB_USER」とか入力されて、それがまかり通るようなソースを書いていると、あっという間に、システムは逝ってしまうわけですね。こわー。

そういう意味ではSQLの終端文字を受け付けないODBCはある意味、安全ってコト?(うーん、でもODBCとDBの組み合わせによっては終端文字OKな場合もあるのかなー?ありそうな気もするなー)

2 件のコメント:

イシカワ さんのコメント...

SQLインジェクションですな。2本SQLを投げるやり方の他に
「DELETE FROM TB_USER WHERE user_id = '(入力値)';」
(入力値)に 「X' OR '0' = '0 」なんて方法もあります。

上記の方法は、2本投げられないDBにも使えるのでとっても
汎用的です。(笑)

じょに さんのコメント...

そうそう昨日、ちょうどこんな記事を読みました。
SQLインジェクション攻撃の波が再来、通常の70~100倍に
ASPアプリがかなりターゲットになっているみたいですね。
fujiのアレは大丈夫なのかしら…
(私と育ちが一緒なので知っているとは思えない)。

で、SQLインジェクションについて調べていたら(無知もいいところ…)
隠されていたSQLインジェクション
この辺とかもひっかかってきて、
PostgreSQLのサブクエリってこんなことまでしちゃうんだ、とビックリ。
ついでにWebのセキュリティテストって色々チェックポイントがあるんですね。
テスト、テストってただ動けばいいんじゃないんだー、
こんなに色々手口があるんだーと軽くカルチャーショック
(バッチ処理・スタンドアローン育ちなので…)。