document.cookieのバリエーション

よくXSSがないかどうかのテストでalert(document.cookie)が実行できるか試すというのがありますが、そのバリエーションの紹介。

まず、JavaScriptではオブジェクトは連想配列としてもアクセスできるので。

alert(document["cookie"]);

ダブルクォートをシングルクォートに変えることも可能ですが、クォートが使える場合でないとXSSできないので、あまり使い道はなさそうですが。ドットは使えないがクォートが使えるという特殊なケースで役立つことでしょう。

また、連想配列としてアクセスする場合、キーは文字列なので16進表記で。

alert(document["\x63\x6f\x6f\x6b\x69\x65"]);

あと、かなり変態的でおもしろいのが以下。

alert(document[({}+[])[!+[]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}+[])[+!![]]+"kie"]);

({}+[])はオブジェクトが文字列にキャストされ、[object Object]に。そして、![]はfalse、!![]はtrue、+で演算するとtrueは1になり、結局[!+[]+!![]+!![]+!![]+!![]]は5。

ということで、[object Object]という文字列から何文字目かを指定して、cooを作成し、残りのkieと結合してcookieという文字列を作成したということのようです。

記号は使えるけど、英数字があんまり使えない環境で有効でしょう。

上記のバリエーションで、16進表記を使ったもの。

alert(document[({}+[])[!+[]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}+[])[+!![]]+"\x6b\x69\x65"]);

あとは、thisを使ったもの。

alert(this["document"]["cookie"]);

まあ、XSSをブラックリストで防ぐのは非常に困難という話です。

参考

Tags: security, xss, javascript

電子書籍『FuelPHP Advent Calendar 2013』が達人出版会より出版されました!

FuelPHP Advent Calendar 2013」の記事を元に編集した電子書籍『FuelPHP Advent Calendar 2013』が、IT系で定評のある電子書籍出版社である「達人出版会」より2013/12/27に出版されました。

FuelPHPは、日本で人気のあるオープンソース(MITライセンス)のPHPフレームワークです。この1年でFuelPHPで構築された多くのサイトがリリースされており、日本での実務での利用実績も飛躍的に増え定着した感があります。日本語の情報も非常に増え、CakePHPには及びませんが、他の有名フレームワークに勝るとも劣らない状況だと思います。

FuelPHP Advent Calendar 2013
FuelPHP Advent Calendar 2013参加有志
達人出版会
発行日: 2013-12-27
対応フォーマット: EPUB, PDF

以下の達人出版会のサイトに会員登録すれば、どなたでも無料で入手(ダウンロード)できます。

この書籍は、アドベントカレンダーの記事をまとめ編集したものです(ブログ記事の誤りもいくつか修正されています)ので、内容的には記事の寄せ集めであり一貫性はありません。また、順番も基礎から応用へというに整理されたものではありませんが、FuelPHPの最新の情報をいろいろな人が書いており、さまざまなトピックが含まれています。

内容は、開発環境の構築からレンタルサーバやPaaSでの使い方、ユニットテストの書き方、Twigの使い方、RESTful APIの作成方法、Composer、MongoDB、Fluentd、ユーザ認証に関するものなど非常に多岐に渡ります。

DRMフリーのPDF版とEPUB版がありますので、お好きなデバイスで読めると思います。無料ですので、ぜひ、読んでみてください!

また、これでFuelPHP Advent Calendarは3年連続、電子書籍化され有名出版社より出版されています。3年連続で出版されているアドベントカレンダーはFuelPHPのものだけだと思います。

去年、一昨年のものは若干古くなってしまっているとは思いますが、それでもいろいろと参考になる点も多いです。年末年始にまとめて読んでみるのもいいのではないでしょうか。

Tags: fuelphp, ebook

FuelPHP 1.7でのTwigのセットアップ

Twigのインストール

ComposerからTwigをインストールします。

まず、composer.jsonに設定を追加します。ここでは、バージョンは「1.*」としてTwig 1.xの最新版を指定しています。

diff --git a/composer.json b/composer.json
index e1b21ea..2e8f6da 100644
--- a/composer.json
+++ b/composer.json
@@ -18,7 +18,8 @@
     "require": {
         "php": ">=5.3.3",
         "monolog/monolog": "1.5.*",
-        "fuelphp/upload": "2.0.1"
+        "fuelphp/upload": "2.0.1",
+        "twig/twig" : "1.*"
     },
     "suggest": {
         "mustache/mustache": "Allow Mustache templating with the Parser package",

composerからインストールします。

$ php composer.phar update

config.phpでParserパッケージを有効にします。

diff --git a/fuel/app/config/config.php b/fuel/app/config/config.php
index 5993891..16840eb 100644
--- a/fuel/app/config/config.php
+++ b/fuel/app/config/config.php
@@ -257,7 +257,7 @@ return array(
    /**************************************************************************/
    /* Always Load                                                            */
    /**************************************************************************/
-   // 'always_load'  => array(
+   'always_load'  => array(

        /**
         * These packages are loaded on Fuel's startup.
@@ -270,9 +270,10 @@ return array(
         *     array('auth' => PKGPATH.'auth/')
         * );
         */
-       // 'packages'  => array(
+       'packages'  => array(
        //  //'orm',
-       // ),
+           'parser',
+       ),

        /**
         * These modules are always loaded on Fuel's startup. You can specify them
@@ -308,6 +309,6 @@ return array(
         * If you don't want the lang in a group use null as groupname.
         */
        // 'language'  => array(),
-   // ),
+   ),

 );

テンプレートの拡張子の設定

FuelPHPでのテンプレートエンジンと対応する拡張子の設定は、fuel/packages/parser/config/parser.phpにあります。デフォルトは以下のようになっています。

    'extensions' => array(
        'php'       => 'View',
        'twig'      => 'View_Twig',
        'mthaml'    =>  array('class' => 'View_HamlTwig', 'extension' => 'twig'),
        'mustache'  => 'View_Mustache',
        'md'        => 'View_Markdown',
        'dwoo'      => array('class' => 'View_Dwoo', 'extension' => 'tpl'),
        'jade'      => 'View_Jade',
        'haml'      => 'View_Haml',
        'smarty'    => 'View_Smarty',
        'phptal'    => 'View_Phptal',
    ),

'twig' => 'View_Twig'となっているため、デフォルトでは拡張子twigのファイルがテンプレートとされます。

エスケープについて

FuelPHPでのTwigの設定は、fuel/packages/parser/config/parser.phpにあります。デフォルトは以下のようになっています。


    // TWIG ( http://www.twig-project.org/documentation )
    // ------------------------------------------------------------------------
    'View_Twig' => array(
        'auto_encode' => true,
        'views_paths' => array(APPPATH.'views'),
        'delimiters' => array(
            'tag_block'     => array('left' => '{%', 'right' => '%}'),
            'tag_comment'   => array('left' => '{#', 'right' => '#}'),
            'tag_variable'  => array('left' => '{{', 'right' => '}}'),
        ),
        'environment' => array(
            'debug'                => false,
            'charset'              => 'utf-8',
            'base_template_class'  => 'Twig_Template',
            'cache'                => APPPATH.'cache'.DS.'twig'.DS,
            'auto_reload'          => true,
            'strict_variables'     => false,
            'autoescape'           => false,
            'optimizations'        => -1,
        ),
        'extensions' => array(
            'Twig_Fuel_Extension'
        ),
    ),

ここで、'auto_encode' => trueは、FuelPHPでの自動エスケープ(Viewに渡す時の自動エスケープ)が有効、'autoescape' => falseは、Twigでの自動エスケープが無効、という意味です。

デフォルトがTwigの標準とは異なりますので、注意してください。

テンプレートの指定方法

通常は、公式ドキュメントにあるように、拡張子twigを付けたファイル名を指定します。

Response::forge(View::forge('index.twig'));

以下のようにView_Twigオブジェクトを生成する方法もあります。

 Response::forge(View_Twig::forge('index'));

Twigの拡張

Twigの拡張をFuelPHPで使う方法は、以下の記事が詳しいです。

Tags: fuelphp, twig