最近ちょーっとバタバタして(仕事で忙殺+頭に大怪我+五月病)、更新とまっておりました。
この「ど素人がWebサービスを立ち上げるまで何日かかる?」シリーズ、連載とか言いつつ、結局2回でストップ。
三日坊主も裸足で逃げ出すほどのいい加減っぷりでした。てへ。
で、もう本人もそんな存在を忘れていた頃、社命で一つWebサービスを立ち上げることになりまして、慌てて勉強を再開した次第でございます。
まあ、とは言っても、壁の中(社内LAN)での簡単なWebアプリなら作った経験はございまして。プロトタイプは比較的すいすいっと作れたんですが、・・・それを外に公開するとなると、話は全く別物。
- セキュリティどうすんの?
- なんとかインジェクションとかクロス・・・なんとかやら、攻撃手法はいっぱいあるみたいだけど、具体的にどうやって防げばいいん?
- 公開したらログから怖くて目がはなせないよう!
・・・知識として知ってはいても、それらに実際に対処するとなるとガクブルです(へたれ)。
まあ不安がっててもしょうがないのよね。
どうやったらいいかわからなかったら、お勉強すればいいじゃん。
ということで、IPAの「安全なウェブサイトの作り方」からテキストをダウンロードして、お勉強しながら、へーはーふーんと、修正してみることにしました。
テキストはPDFでダウンロードできました。べんりー。
・・・まず手をかけたのが、SQLインジェクションへの対策。
ワタクシ本業は物書きでございますので(こう見えても)、知識として知っているつもりではありました。
でも所詮、知識は知識。
どうしてそんなに怖いのか、テキストの実例を見るまではピンときませんでした。
で、テキストに「脆弱な実装」として書かれているのが、例えばこんなの。
$query = "SELECT * FROM usr WHERE uid = '$uid' AND pass = '$passh';・・・へ?これ脆弱なの?だってネットにあるサンプル、だいたいこんなんだよ・・・
でもテキスト様曰く:
「・・・$uidに悪意あるSQL文が形成される値が指定された場合、SQLインジェクション攻撃が成功してしまいます。」・・・えーと・・・攻撃されるとどうなんの?
「たとえば、ユーザIDに「taro'--」という文字列が与えられた場合、(略)ハイフンの繰り返し「--」は、それ以降の内容をコメントとして無視させる意味をもちます。このため、この文字列が与えられた場合、データベースは「' AND pass = eefd5bc2...」を無視します。」・・・。
!?
えっ、それって、太郎さんのパスワード知らなくても、「SELECT *」で太郎さんの情報全部とれちゃう・・・の・・・?
太郎さんのパスワードはおろか、太郎さんのあんな情報もこんな情報も筒抜けになってしまうってこと?
怖い!!・・・ハイフン二つで太郎さん丸裸!!怖すぎる!
これ読んでから、プレースホルダを使って後から変数を当てはめるよう、慌てて全部のSQL文を修正・・・。
それにしても量が多すぎる・・・しんどいよう・・・しかもただ修正しただけでは動かないところ多いし・・・。
ちゃんと最初からテキスト読んでおけばよかった・・・。
P.S.:
そういえば、今週、メインの携帯をASUS Zenfone 5に変えました。16GB。
モンスターマシンのZenfone 2が発売されたっていうのに、あえて旧モデルをチョイス。
だって、Zenfone 2ってスペックもモンスターなら、大きさもモンスターなんですもの。でけえ。あんなの片手で持ったら疲れちゃうよ。
それに比べるとZenfone 5は、ちょっと大きめではあるけど、なんとか片手で使えるくらいの大きさ。
画面も綺麗だし、写真も綺麗に撮れるし、電池もわりと持つし、わたしゃこれで十分ですわ。
なんてったって、安い。XperiaとかiPhoneとかの半分くらいだもの。それでいて、別に大した違いはないし。
でも、バッテリーが交換できない機種を使うのは初めてで、いつ切れるかハラハラしながら使ってます。ぷー。
(でもおかげでバッテリーを長持ちさせる方法とか調べまくって、やっとまっとうな使い方を覚えました。やたらと充電しちゃいけない。放置プレイはダメダメ、など)