SQLインジェクション

SQLインジェクションというクラッキング手法について。参照:SQLインジェクション - Wikipedia


例えば、

select * from database where id = '(ユーザ入力)';

というSQL文があり、ユーザは自分のidを入力してdatabaseの情報を読むという作業ができるとする。
当然普通は入力に

5

などとして、id=5の情報をselectしてくる。
しかし、ここで、

5'; drop table database; select * from database2 where id = '5

' OR 't' = 't

といった文を入力とすると、データベース上では

select * from database where id = '5'; drop table database; select * from database2 where id = '5';
select * from database where id = '' OR 't' = 't';

というSQLが実行されることとなり、
前者では、データベースが消去され、
後者では、t=tが常に成り立つので、databaseテーブルがすべて表示されてしまい、他人の情報が盗みとれてしまう。


これはもちろん、データベース管理者の意図せぬ動作であり、こういう入力に対して対策をしておかないと、
大変なことになるってことです。



肝心の対策ですが、
もともとのSQL文を

select * from database where id = '' (ユーザ入力)'';

とシングルクオーテーションをエスケープすることで、確実に外側のシングルクオーテーション内が一つの文字列とみなされるようになる。


その他、最近のデータベースのAPIでは、API内ですでにエスケープが施されていることも多いのだとか。
実際、今日postgreSQLで実験してみたが、pg_query関数ではSQLインジェクションできないようになっていた。


セキュリティて大事ですね。


ところで、こういう情報をウェブ上に載せるのは、ネット倫理的に大丈夫なんやろか。
自分のメモとはいえ、心配。