BEAR.Sundayでコンタクトフォームを作ってみる③

BEAR.Sundayでコンタクトフォームを作ってみる②の続きです。

まず、XSS脆弱性をつぶします。

Twigのautoescapeを有効にする

BEAR.SundayのTwigの設定は、vendor/bear/package/src/Provide/TemplateEngine/Twig/TwigProvider.php(つまり、BEAR.Packageの中)にあります。

ここで、以下のようになっており、autoescapefalseになっています。

vendor/bear/package/src/Provide/TemplateEngine/Twig/TwigProvider.php

        $twig = new Twig_Environment($loader, [
            'cache' => $this->tmpDir . '/twig/cache',
            'debug' => true,
            'autoescape' => false,
        ]);

これをtrueに変更します。

vendor/bear/package/src/Provide/TemplateEngine/Twigフォルダの中にある

  • TwigProvider.php
  • TwigModule.php

をsrc/Module/Providerフォルダを作成し、そこにコピーし変更します。

TwigProvider.phpを以下のように変更します。autoescapeをtrueに変更し、後はクラス名を調整しています。

--- vendor/bear/package/src/Provide/TemplateEngine/Twig/TwigProvider.php    2014-08-09 07:11:26.000000000 +0900
+++ src/Module/Provider/TwigProvider.php    2014-08-09 14:29:22.000000000 +0900
@@ -1,16 +1,13 @@
 <?php
-/**
- * This file is part of the BEAR.Package package
- *
- * @license http://opensource.org/licenses/bsd-license.php BSD
- */
-namespace BEAR\Package\Provide\TemplateEngine\Twig;
+
+namespace Kenjis\Contact\Module\Provider;

 use BEAR\Sunday\Inject\LibDirInject;
 use BEAR\Sunday\Inject\TmpDirInject;
 use Ray\Di\ProviderInterface as Provide;
 use Twig_Environment;
 use Twig_Loader_Filesystem;
+use BEAR\Package\Provide\TemplateEngine\Twig\Extension\AuraForm_Twig_Extension;

 /**
  * Twig
@@ -33,11 +30,11 @@
         $twig = new Twig_Environment($loader, [
             'cache' => $this->tmpDir . '/twig/cache',
             'debug' => true,
-            'autoescape' => false,
+            'autoescape' => true,
         ]);

         $twig->addExtension(new \Twig_Extension_Debug());
-        $twig->addExtension(new Extension\AuraForm_Twig_Extension());
+        $twig->addExtension(new AuraForm_Twig_Extension());

         $function = new \Twig_SimpleFunction(
             'href',

TwigModule.phpを以下のように変更します。変更したTwigProvider.phpがバインドされるようにクラス名を調整します。

--- vendor/bear/package/src/Provide/TemplateEngine/Twig/TwigModule.php  2014-08-09 07:11:26.000000000 +0900
+++ src/Module/Provider/TwigModule.php  2014-08-09 14:29:22.000000000 +0900
@@ -1,10 +1,6 @@
 <?php
-/**
- * This file is part of the BEAR.Package package
- *
- * @license http://opensource.org/licenses/bsd-license.php BSD
- */
-namespace BEAR\Package\Provide\TemplateEngine\Twig;
+
+namespace Kenjis\Contact\Module\Provider;

 use Ray\Di\AbstractModule;
 use Ray\Di\Scope;
@@ -18,7 +14,7 @@
     {
         $this
             ->bind('BEAR\Sunday\Extension\TemplateEngine\TemplateEngineAdapterInterface')
-            ->to(__NAMESPACE__ . '\TwigAdapter')
+            ->to('BEAR\Package\Provide\TemplateEngine\Twig\TwigAdapter')
             ->in(Scope::SINGLETON);
         $this
             ->bind('Twig_Environment')

最後に、src/Module/AppModule.phpに以下を追加して、作成したProvider\TwigModuleがインストールされるように設定します。

--- a/src/Module/AppModule.php
+++ b/src/Module/AppModule.php
@@ -33,6 +33,9 @@ class AppModule extends AbstractModule
     {
         $this->install(new StandardPackageModule('Kenjis\Contact', $this->context, dirname(dirname(__DIR__))));

+        // override twig module
+        $this->install(new Provider\TwigModule($this));
+
         // override module
         // $this->install(new SmartyModule($this));

これで、最初のStandardPackageModuleの中でインストールされたデフォルトのTwigの設定が、作成したProvider\TwigModuleでオーバーライドされます。設定をオーバライドするために、new Provider\TwigModule($this)$thisを忘れずに記載してください。

これでコンタクトフォームにHTMLタグを入力しても、表示では正しくエスケープされることを確認してみましょう。

文字化けの修正

実は、前回送信したメールの本文の日本語が文字化けしていました。

調査したところ、検証エラーのページでブラウザが文字エンコーディングを誤検知してShift_JISになっていました。

HTTPヘッダで文字エンコーディングが指定されていなかったので、 bootstrap/instance.phpでdefault_charsetを設定しておくことにします。

--- a/bootstrap/instance.php
+++ b/bootstrap/instance.php
@@ -10,6 +10,9 @@ namespace Kenjis\Contact;

 use BEAR\Package\Bootstrap\Bootstrap;

+// set default charset
+ini_set('default_charset', 'UTF-8');
+
 require_once __DIR__ . '/autoload.php';

 $app = Bootstrap::getApp(

これで、HTTPヘッダにUTF-8が指定されるようになりました。

XSS脆弱性とメールの文字化けが解消しましたので、CSRF対策はまだですが、今日はここまでにします。

BEAR.Sundayでコンタクトフォームを作ってみる④へ続く。

過去記事

関連

Date: 2014/08/13

Tags: bear