久しぶりの FuelPHPネタ。
FuelPHPのセキュリティはどうなってんの?
デフォルトでは Fuel は入力時に POST や GET 変数をフィルタせず、出力時にすべてをエンコードします。 Fuel はまた URI セグメントを使ったときに予期せぬ嫌なことが起こらないように URI もエンコードし、データベースに入るすべてをエスケープします。
エンコードとは、データを一定の規則に基づいて別の形式のデータに変換すること。符号化、エンコーディングとも呼ぶ。
データ暗号化やデータ圧縮もエンコードの一部。
日本語ドキュメントを解読していこう。
今回、プログラムは少なめです。
目次
- 出力エンコーディング
- CSRF 保護
- XSS フィルタリング
- 入力フィルタリング
- SQL インジェクション
出力エンコーディング
出力エンコーディングについて。
デフォルトでは、Fuel は入力フィルタリングより出力エンコーディングを好みます。その理由は2つの要素からなります。 あなたのデータがどこから来たものであろうと、そしてそれがフィルタされていようがいまいが、出力エンコーディングはそのデータを クライアントに送信する際に無害にします。これは、すべての入力は生のまま、変更のないかたちで保存され、何が起ころうと、 あなたはいつでも元データにアクセスできるとことも意味します。
FuelPHPで出力エンコーディングが重要視されるのは、入力されたデータを元のままアクセスするため。
データは、クライアントに送信する際に無害化される。
つまり、XSS対策を出力エンコーディングで行なってるってこと?
処理する場所が通常のHTMLへ出力するところでなく、ビューに変数を渡すところで処理してるってことかな。
こちらの記事もチェック。
CSRF保護
CSRFについては以前かいた記事を参照。
FuelPHPの CSRF保護について。
Fuel は、フォームにセキュリティトークンを含ませることで、この種の攻撃からあなたのフォームを保護するツールを提供します。 フォームの投稿時にトークンは検証され、検証済みの場合、フォームはフォークをリクエストしたクライアントから投稿されたことが確認されます。
CSRF保護はトークンでの検証が一般的だ。
その機能を FuelPHPで実装する場合のプログラミングが以下。
フォームでトークンを追加。
securityクラスを使用する。
// プレーンな HTML で <input type="hidden" name="<?php echo \Config::get('security.csrf_token_key');?>" value="<?php echo \Security::fetch_token();?>" /> // Form クラスを使って echo \Form::csrf(); // form インスタンスを使い、フォームのフィールドセットに検証ルールを追加して $form = \Form::forge(); $form->add_csrf();
送信されたトークンのチェック。
もちろん securityクラスを使用する。
// フォームが投稿されたかどうかチェック if ($_POST) { // CSRF トークンが正しいかチェック if ( ! \Security::check_token()) { // CSRF 攻撃または CSRF トークンの期限切れ } else { // トークンは正しいので、フォームの入力を処理する } }
XSS フィルタリング
XSSについては、以前書いた記事を参照。
FuelPHPの XSS対策について。
Fuel は、とても高速で高度に設定可能な HTMLawed ライブラリを使い、XSS フィルタリングを提供します。 ライブラリは、デフォルトではセーフおよびバランスモードで実行されます。
HTMLawedライブラリを用いて FuelPHPでは XSSフィルタリングを行なっている。
日本語での説明が全然見つからなかった。
使用する場合は xss_cleanメソッドを使う。
ただし、パフォーマンスの理由から、個別の入力値につかうことが勧められている。
通常は出力エンコーディングの処理でXSS対策されているため、個別で必須の場合のみ使用する形でいいのかな。
入力フィルタリング
入力された文字の文字エンコーディングなどをチェックできる。
デフォルトでは有効になっていない。
デフォルトでは有効になっていませんが、すべてのページリクエストで Fuel がすべての入力 ($_GET, $_POST and $_COOKIE) をフィルタするように設定できます。 そうするには、アプリケーションの config/config.php ファイルでフィルタに使用する関数やメソッドを設定します。
有効にする場合は app/config/config.phpを編集する。
/** * Security settings */ 'security' => array( 'input_filter' => array(), )
文字エンコーディングをチェックする場合はこの記事を参考にしよう。
SQL インジェクション
SQLインジェクションについては、以前書いた記事を参照。
FuelPHPでの SQLインジェクション対策はどうなっているのかな。
Fuel は、Database クラスのメソッドの1つに渡されるすべての値をエスケープすることにより、SQLインジェクションから保護します。 これは Fuel の中心となるクエリビルダーのレベルで起こるため、クエリビルダーを使うすべてのコード、Fuel の ORM パッケージを含みます、は自動的にエスケープされます。
クエリビルダを使えば全ての SQLはエスケープされる。
自分で変な実装さえしなければ、SQLインジェクションは大丈夫そう。
自分はDBクラスを使ってるけど、Ormクラスや CRUDクラスでも安全。
参考
Security – 概要 – FuelPHP ドキュメント Security – クラス – FuelPHP ドキュメント
FuelPHP でのセキュリティ対策(1) – A Day in Serenity @ kenjis
コメント