前回の「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=BEARをgetしてみましょう。
$ 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は結構簡単でした。
関連