Webアプリケーションのセキュリティを少々気にしてみる

おはよう世界きゅん。どうも、じゅじゅいちです。

さて、外部に公開されているWebアプリケーションが常に攻撃に晒されている状況はもちろんあなたもご存知でしょう。もし、あなたが洞窟の奥の方か何かに住んでいなければね。

もちろんあなたがWebアプリケーションを作ったとしても外部に一切公開しなければセキュリティなど考慮する必要はない。しかしあなたは優秀で、自らの作った有意義なWebアプリケーションを外部に公開したいと思っている。そこで悩むのがセキュリティについてだ。どうしたら解決できるか知りたい人もいるだろう。

そんな需要に応えて、今日はイカれた本を紹介するぜ!

それがこれだ → 体系的に学ぶ 安全なWebアプリケーションの作り方

こちらは代表的なサイト攻撃について具体的な攻撃とそれに対処するためのコードが書かれています。特にXSSについては「こんな方法があったのか!」と思うようなハッカーな方法が載っていて衝撃的でしたね。

この本はPHPなどでデータベースにアクセスするようなプログラミングをした人ならすぐに理解できると思いますので、Webアプリケーションを作っていこうという人は必読の書籍ですね。

さて、本当はこの本の内容を基にしてセキュリティー的なコーディング規約を作成しようと思ったのですが、やる気がどうもなく、また移り気な性格のため、ここではほんの一部をログとして書いておこうと思います。

1.XSS(クロスサイト・スクリプティング)

1-1.概要

外部からの入力に応じて表示が変化する箇所があり、この部分のHTML生成の実装に問題があるとXSSという脆弱性が生じます。

1-2.詳細

echo $_GET['hoge'];

上のような感じのコードですかね。urlのクエリ部分にJavaScriptなどを書かれてるとそのままJavaScriptとして実行されてしまいます。

たとえば

hoge.jp

としたらそのままJavaScriptが実行されてしまいます。実際これだけではたいしたことはありませんが、その他の脆弱性と合わせるとヤバイ事態が発生したりします。

1-3.対策

htmlspecialchars関数を使用してHTMLエスケープしたらええねん。例えば…

htmlspecialchars($_GET['hoge'],ENT_QUOTES,"UTF-8")

みたいにね。関数の詳細についてはPHP: htmlspecialchars – Manualを見て欲しい。これでスクリプトとしてみなされずに済みます。

とりあえずこれは必須で、その他の方法は書籍を見ればされに詳しく載っています。

2.SQLインジェクション

2-1.概要

SQLの呼び出し方に不備がある場合に発生する脆弱性。

2-2.詳細

例えばログイン画面で、IDとパスワードを入力する箇所がありますが、IDとパスワードが一致するかどうかはDBにアクセスして確かめていると思います。

そのSQLで

'SELECT * FROM USER WHERE id = \''.$_GET['id'].'\''.' and pwd = \''.$_GET['id'].'\''

とか書いてたら大変です。パスワード項目に’ or ‘a’=’aと入力したらどうなるでしょうか?

SELECT * FROM USER WHERE id = 'jujuichi' and pwd = '' or 'a'='a

なんということでしょう。IDさえ分かればパスワードどうであろうと無視されてしまっているではありませんか。

2-3.対策

プレースホルダによりSQL文を組み立てます。MDB2というSQL呼び出しライブラリを使って以下のようにすれば良いみたいです。やってみてません><

$sql = "SELECT * FROM USER WHERE id = ? and pwd = ?";

FuelPHPでは以下のように書けばよいです。

$query = DB::select()->from('user');
$query->where('id','=',$id);
$query->where('pwd','=',$pwd);
$result = $query->execute();

3.その他

あとCSFRを防ぐために、更新ページの直前にトークンを埋め込む、とかいろいろありますが、もう力尽きたんでここらへんにしときます。

4.おしまいにゃ

セキュリティ対策はやってもやっても万全ってことはなさそうですが、分かってる範囲で出来ることはやってみた方が良いですねとしか。

そんなわけでまた気が向いたら追記していきたいと思います(多分追記しない)。

それではまた。

コメント