BEAR.Sundayでの「Hello World!」②

前回の「Hello World!」の続きです。

今回はテンプレートエンジンを使い、XSSを解消します。

Helloページリソースの変更

src/Resource/PageフォルダにあるページリソースHello.phpを少し変更します。

src/Resource/Page/Hello.php

<?php

namespace My\Hello\Resource\Page;

use BEAR\Resource\ResourceObject;

class Hello extends ResourceObject
{
    public function onGet($name = 'World')
    {
        $this['name'] = $name;
        return $this;
    }
}

$this['name']に引数で渡された$nameを代入しています。

テンプレートの作成

デフォルトのテンプレートエンジンはTwigです。

Helloページリソースに対応する、テンプレートファイルHello.twigを同じsrc/Resource/Pageフォルダに作成します。

src/Resource/Page/Hello.twig

{% autoescape %}
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
<div class="container">
    <h1>Hello {{ name }}!</h1>
</div>
</body>
</html>
{% endautoescape %}

ページリソースで$this['name']に代入したものがnameとして使えます。

ビルトインWebサーバの起動

それでは、PHPのビルトインWebサーバを起動して、ブラウザからアクセスできるようにしましょう。

$ php -S 0.0.0.0:8000 -t var/www/ bootstrap/contexts/dev.php

ブラウザからのアクセス

http://localhost:8000/helloにアクセスしてみましょう。

Note: もし、何かエラーが出た場合は、Xdebugをoffにしてみましょう。

次は、http://localhost:8000/hello?name=BEARにアクセスしてみましょう。

クエリ文字列でnameにBEARを渡しましたので、表示が「Hello BEAR!」に変わりました。

次は、http://localhost:8000/hello?name=<s>BEAR</s>にアクセスしてみましょう。

TwigによりHTMLタグが無効化されています。

コマンドラインからのアクセス

BEAR.Sundayではコマンドラインからもページにアクセスできます。

$ php bootstrap/contexts/dev.php get /hello
200 OK
cache-control: ["no-cache"]
date: ["Sat, 21 Jun 2014 08:15:29 GMT"]
[BODY]
name World,

[VIEW]
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
<div class="container">
    <h1>Hello World!</h1>
</div>
</body>
</html>

[BODY]nameとその値Worldが、そして[VIEW]にHTMLでの表現が表示されています。

次に/hello?name=BEARgetしてみましょう。

$ php bootstrap/contexts/dev.php get /hello?name=BEAR
200 OK
cache-control: ["no-cache"]
date: ["Sat, 21 Jun 2014 08:16:57 GMT"]
[BODY]
name BEAR,

[VIEW]
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
<div class="container">
    <h1>Hello BEAR!</h1>
</div>
</body>
</html>

WorldだったところがBEARに変わりました。

まとめ

Twigを使うことで簡単にXSSに対応することができました。

BEAR.SundayでもHello Worldは結構簡単でした。

関連

Date: 2014/06/21

Tags: php, bear, twig