symfonyの出力エスケープを追う その2

その1はこちら
symfonyフレームワークのセキュリティ - あんこの成長記録


前回に続いて、コードを追いながらsymfonyの出力エスケープについて勉強していきたいと思います。
どこかに載ってる説明読むより、実際にコード追った方がしっかり理解できると思ってるので、しっかりコード追えるようになりたいです。

前回は、lib/vendor/symfony/lib/helper/EscapingHelper.phpで定義されたesc_specialchars()で、htmlspecialchars()によって出力エスケープが行われているところまで追って、力つきました。

ソースを追ったところ、出力エスケープを行っているesc_specialchars()の呼び出し元は、lib/vendor/symfony/lib/escaper/sfOutputEscaper.class.php 92行目の

if (is_scalar($value))
{
  return call_user_func($escapingMethod, $value);
}

です。

PHP: call_user_func - Manual

この部分で、エスケープ対象の変数$valueスカラーなら、call_user_func()によって$escapingMethodによって指定された関数が呼び出されます。

$escapingMethodには'ESC_RAW', 'ESC_SPECIALCHARS', 'ESC_ENTITIES', 'ESC_JS', 'ESC_JS_NO_ENTITIES'のいずれかが指定され(デフォルトは'ESC_SPECIALCHARS')、それぞれlib/vendor/symfony/lib/helper/EscapingHelper.phpにおいて

define('ESC_SPECIALCHARS', 'esc_specialchars');

のようにdefineによって定数宣言されているので、最終的にEscapingHelper.phpで定義されているesc_specialchars()等の関数が呼び出されて、出力がエスケープされます。
PHP: define - Manual

PHPにおけるスカラーって?

PHP: is_scalar - Manual
によると、is_scalar()がtrueを返す、つまりPHPにおけるスカラー

  • integer
  • float
  • string
  • boolean

のいずれかで、配列やオブジェクトは含まれません。

もう少し

せっかくなので(というか楽しくなってきたので)、もう少しコードを追ってみたいと思います。
次は、$escapingMethodの値の由来(おそらく設定ファイルに行き着くはず)とか、is_scalar()がfalseの場合、つまり配列やオブジェクトの場合の挙動なんかを追いたいと思います。

書いてるうちに、いろいろ気になって長くなってしまいがちなので、短めにして更新頻度を増やしたい。
と、反省。