今回の学習のテーマは、SQL Injection(SQLインジェクション:SQLの挿入)です。
復習&理解を深めます。
こちらを参考に学習。
うーん@ITはすばらしい情報ばかりだ。
○SQLインジェクションとは?
Webサイトを構成する要素の1つにデータベースがある。Webアプリケーションからデータベースを操作するために使われるのがSQLで、このSQLを偽造してデータベースの操作をしてしまおう、というのがこの攻撃だ。プリケーションの裏にデータベースがあり、データベースと連携してサービスを行っているシステムが攻撃対象となる。データベースに含まれるデータすべてを奪われる、削除されるなどの被害が想定される。
うーん。恐ろしい攻撃です。
ということで、仮にフォームを作って、記事に書いてある現象を確認してみる。
実際にやってみると、やっぱり実感がわく。うーん。怖い攻撃です。とっても簡単だし。
対策の1つは、ごく当たり前の「入力値チェック」と「サニタイジング」だ。
注意すべき文字列は、「 SQL92での特殊文字 」 だ。
具体的に言うと
----------------------------------
空白 ( ) → 文字列やコマンドの区切りに使われる
" ' , → 文字列の区切りに使われる
- → 負の数を表すために使われる
. → フィールドの指定に使われる
& + / | → 演算子として使われる
: → 数の設定に使われる
; → コマンドの区切りに使われる
< = > → 演算子として使われる
% ? * _ → 正規表現で使われる
----------------------------------
たくさんあるので、可能な限り英数字だけに入力制限する方が安全だ。
実は、今回データベースライブラリとして利用している「 ADOdb 」には、入力文字列をクオートするメソッドがある。
[ qstr ]
今回は、これを利用しようと思う、実験したらちゃんと、入力文字列をクオートしてSQLインジェクションを防いでくれました!
もう1つの対策として、準備済みSQL文(プレースホルダ、バインドメカニズムと呼ばれることもある)を使う方法がある。
バインドメカニズムについては、コチラの「バインドメカニズムを活用しよう」に分かりやすく載っている。
PHPでバインドメカニズムを実践する場合は、コチラだ。