FuelPHP でのセキュリティ対策(3)

FuelPHP Advent Calendar 2011 の 24日目です。

昨日は、@akibe さんの「FuelPHPをNginxで動かしてみる」でした。


とうとうアドベントも最終局面に入って来ました。というかすでに日没を過ぎたので終わっているのでしょうか?

天使は言った。「恐れるな。わたしは、民全体に与えられる大きな喜びを告げる。
今日ダビデの町で、あなたがたのために救い主がお生まれになった。この方こそ主メシアである。
あなたがたは、布にくるまって飼い葉桶の中に寝ている乳飲み子を見つけるであろう。これがあなたがたへのしるしである。」

(ルカ 2:10-12)

という聖書の言葉を多くの方が耳にしたり、思い出されているのではないかと思います。


今日は、FuelPHP でのセキュリティ対策の 3回目です。

以前の記事

XSS フィルタ

XSS 対策として、自動の HTML エスケープでは処理できない場合、XSS フィルタを使う必要が生じるかも知れません。

FuelPHPXSS フィルタ (Security::xss_clean() メソッド) は、htmLawed というライブラリを使用しています。

公式サイトを読んでいくと、

A comparison of standalone HTML filters shows that only the HTMLPurifier script comes the closest to htmLawed in terms of efficacy and features. Though good, HTMLPurifier is slow, 15-20 times bigger, uses scores (hundreds?) of files, and consumes a few megabytes of RAM memory just to be loaded. It does not provide full HTML support, lacks some features like customizable code beautification, and has poor end-user documentation. Its code is also no longer PHP 4-compatible.

http://www.bioinformatics.org/phplabware/forum/viewtopic.php?id=55

htmLawed にもっとも近いのは HTMLPurifier で、HTMLPurifier もまあまあだけど、遅いし、15〜20倍でかくメモリ食い。
で、HTML をフルサポートしてなくて、カスタマイズ性に欠け、エンドユーザ向けのドキュメントもあんまねーよ。

(訳ではありません…)

と、かなり自信満々なのですが、しかし、このライブラリ、日本では全くと言っていいほど無名です。

で、調べていくと concrete5 でも使われているようです。以下のようなコードがありました。

concrete/models/attribute/types/textarea/controller.php

<?php
…略…
	public function getDisplaySanitizedValue() {
		$this->load();
		if ($this->akTextareaDisplayMode == 'text') {
			return parent::getDisplaySanitizedValue();
		}
		return htmLawed(parent::getValue(), array('safe'=>1, 'deny_attribute'=>'style'));
	}

FuelPHP の Security クラスでは、以下のようなオプションになっています。

htmLawed($value, array('safe' => 1, 'balanced' => 0));

www.exploitsearch.net で 検索 すると、色々出てきて、過去に CVE とかもありますので、全くレビューされていないというわけではないのは確かです。

このライブラリがどれくらい安全かはまだわかりませんが、言われるように結構ドキュメントが豊富ですし、オプションがものすごい数ありますので、適切に使用すればかなりいけてるのかも知れません。すくなくとも、CodeIgniter の XSS フィルタよりは、かなりよさそうです。

ということで、使用する場合は、ドキュメント(英語) をよく読んで適切に使用しましょう。

あるいは、FuelPHP 用の HTML Purifier のパッケージは以下にあります。

余談。なお、JavaScript を動的に生成するなど、ヤバい場所に変数を使う必要がある場合は、さらに Unicode エスケープなどの処理が必要になる場合があります。XSS 対策全般については、以下の記事を参考にしてください。

その他のセキュリティ対策

その他の気がついた点も書いておきます。

default_charset (HTTP レスポンスヘッダの文字エンコーディング)

FuelPHP では、default_charset は設定しません。以下のコードを追加しておくと、php.ini で設定されていない場合も安心です。

// set default charset
ini_set('default_charset', 'UTF-8');

一番簡単なのは、config.php に追加することです。

display_errors (エラー表示)

何故か、display_errors が 1 に設定されています。コメントにあるように本番環境では 0 に変更しておきましょう。

public/index.php

<?php
* Set error reporting and display errors settings.  You will want to change these when in production.
*/
error_reporting(-1);
ini_set('display_errors', 1);


と、ざっと FuelPHP のセキュリティについてみてきました。細かいところはまだ見ていないところもありますが、印象としては、割とセキュア、で、またセキュアにしやすい作りになっているという感じです。むろん、完璧とは言い難いですが、まあ、それはどのフレームワークでも似たようなものでしょうし。


P.S. FuelPHP の日本語の情報も増えてきましたので、Wiki にまとめることにしました。

よろしければ、ご覧ください。


明日で、いよいよ、このアドベントカレンダーも最終回です。明日は、@bossatama さんの「FuelPHPでフィーチャフォン(ガラケー)対応について考えてみた」です。お楽しみに!