« Path Traversal(パスの乗り越え) | メイン | 固定IPアドレスの設定 »

SQL Injection(SQLインジェクション:SQLの挿入)

今回の学習のテーマは、SQL Injection(SQLインジェクション:SQLの挿入)です。
復習&理解を深めます。

こちらを参考に学習。
うーん@ITはすばらしい情報ばかりだ。


○SQLインジェクションとは?


Webサイトを構成する要素の1つにデータベースがある。Webアプリケーションからデータベースを操作するために使われるのがSQLで、このSQLを偽造してデータベースの操作をしてしまおう、というのがこの攻撃だ。プリケーションの裏にデータベースがあり、データベースと連携してサービスを行っているシステムが攻撃対象となる。データベースに含まれるデータすべてを奪われる、削除されるなどの被害が想定される。

うーん。恐ろしい攻撃です。

ということで、仮にフォームを作って、記事に書いてある現象を確認してみる。
実際にやってみると、やっぱり実感がわく。うーん。怖い攻撃です。とっても簡単だし。


対策の1つは、ごく当たり前の「入力値チェック」と「サニタイジング」だ。
注意すべき文字列は、「 SQL92での特殊文字 」 だ。
具体的に言うと
----------------------------------
空白 ( ) → 文字列やコマンドの区切りに使われる
" ' ,    → 文字列の区切りに使われる
-      → 負の数を表すために使われる
.      → フィールドの指定に使われる
& + / |  → 演算子として使われる
:      → 数の設定に使われる
;      → コマンドの区切りに使われる
< = >   → 演算子として使われる
% ? * _  → 正規表現で使われる
----------------------------------

たくさんあるので、可能な限り英数字だけに入力制限する方が安全だ。

実は、今回データベースライブラリとして利用している「 ADOdb 」には、入力文字列をクオートするメソッドがある。
[ qstr ]
今回は、これを利用しようと思う、実験したらちゃんと、入力文字列をクオートしてSQLインジェクションを防いでくれました!

もう1つの対策として、準備済みSQL文(プレースホルダ、バインドメカニズムと呼ばれることもある)を使う方法がある。

バインドメカニズムについては、コチラの「バインドメカニズムを活用しよう」に分かりやすく載っている。
PHPでバインドメカニズムを実践する場合は、コチラだ。



トラックバック

このエントリーのトラックバックURL:
http://synth.jp/pg/mt-tb.cgi/59

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

カレンダー


2007年06月
Su Mo Tu We Th Fr Sa
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Map

About

2006年11月29日 11:01に投稿されたエントリーのページです。

ひとつ前の投稿は「Path Traversal(パスの乗り越え)」です。

次の投稿は「固定IPアドレスの設定」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。