SMARTY_RESOURCE_CHAR_SET はテンプレートのエンコーディングを設定するための定数で、あらかじめ定義していない場合はSmartyによって自動的に、mbstring拡張があれば UTF-8 が、なければ ISO-8859-1 が設定されます。 この配列型のプロパティで、組込みの変数エスケープ用修飾子である escape に "html" オプションをつけて指定します。, 動作サンプル http://kholy.gehirn.ne.jp/php-advent/2012/1, escape_html はバージョン3.1から追加されたBoolean型プロパティです。 (htmlspecialchars()の第2引数と第3引数が指定されていない点は問題視されそうですが), 修飾子プラグインと変数フィルタのいずれにおいても、ユーザーが独自のコールバック関数を登録する手段が提供されています。 (途中経過) - A Day in Serenity @ kenjis, http://kholy.gehirn.ne.jp/php-advent/2012/1, http://kholy.gehirn.ne.jp/php-advent/2012/2, http://kholy.gehirn.ne.jp/php-advent/2012/3, http://www.smarty.net/docs/en/variable.escape.html.tpl, http://kholy.gehirn.ne.jp/php-advent/2012/4, 第36回 MOPS:コンテクストを検出するHTMLエスケープ:なぜPHPアプリにセキュリティホールが多いのか?|gihyo.jp … 技術評論社, http://kholy.gehirn.ne.jp/php-advent/2012/5, http://kholy.gehirn.ne.jp/php-advent/2012/6, http://kholy.gehirn.ne.jp/php-advent/2012/7, http://kholy.gehirn.ne.jp/php-advent/2012/8, http://kholy.gehirn.ne.jp/php-advent/2012/9, http://atnd.org/events/22781title=PHP Advent Calendar 2011, マイクロフレームワークをつくろう - Pimpleの上に(Symfony HttpFoundatio…, マイクロフレームワークをつくろう - Pimpleの上に(RESTインタフェース編), マイクロフレームワークをつくろう - Pimpleの上に(Rendererクラス作成編), TECHSCORE BLOGに『PostgreSQLのUUID型とpgcryptoモジュールを使って会員パスワード認証を実装してみる』を掲載していただきました, 画像アップロード(4)IEでもドラッグ&ドロップ対応、Ajax化しつつJavaScript無効の環境にも対応, PHPUnit 4.1系で \Symfony\Component\HttpFoundation\File\UploadedFile のモックオブジェクトを作成しようとすると "Erroneous data format for unserializing" のエラーが発生した件, default_modifiers で指定されたデフォルト修飾子 (複数の場合は指定順に全て実行), $escape_html プロパティによるHTMLエスケープ処理 (TRUEが設定されている場合のみ。デフォルトはFALSE), デフォルト指定されたビルトイン修飾子の escape:"html" によりエスケープされる, 組み込みの htmlspecialchars 変数フィルタによってエスケープされる, nofilter フラグにより全てのデフォルト修飾子および escape_html プロパティ、変数フィルタが無効となる, 自動でHTMLエスケープを行いたい場合は escape_html プロパティで一括して行うべき。(そのためだけに用意されている機能だから), 自動で独自のエスケープ処理を行いたい場合は修飾子プラグインを登録してデフォルト修飾子に指定するか、変数フィルタに登録する。, データをHTMLの要素として出力する場合、自動エスケープを無効にするための余計な記述が必要, nl2br()のようなエスケープ後の変換処理を行う場合、自動エスケープ無効の記述に加えて、本来のエスケープ処理の記述も必要, {variable:n} HTMLエスケープせず、number_format()する. Modifiers and Filters are run in the following order: modifier, default_modifier, $escape_html, registered variable filters, autoloaded variable filters, template instance's variable filters. 修飾子プラグインと変数フィルタを同じ関数で併用する場合は、要注意です。, SmartyFunctionRegistry では、__call() と __callStatic() の2つのマジックメソッドを使うことで、コールバックの代理実行を実現しています。, 当然ながら、マジックメソッド経由でコールバックが呼ばれた場合、通常のコールバック実行よりも速度は遅くなります。 一般ユーザのログイン処理とは、「ログイン」画面を表示し、ログインを実行してから「業務」画面を表示するまでの一連の処理を指します。 一般ユーザのログイン処理について、以下の順に説明します。 一般ユーザのログイン処理フロー. ブログを報告する, Smarty3のHTMLエスケープ方法いろいろ + 修飾子プラグインと変数フィルタ (PHP Advent Calendar 2012 Day 11), 初めて Pull Request した話。 #phpadvent2012 | slumbers, PHP ユーザは実際はどんなテンプレートエンジンを使っているのか? (Smarty クラス自身も Smarty_Internal_TemplateBase を継承しているので、参照関係がやばいことになってるはず…), つまり、Smarty_Internal_Template オブジェクトを取得できる関数では、Smartyのあらゆる機能を利用できるということです。 (試してはいませんが、mbstring.internal_encoding と異なる値を SMARTY_RESOURCE_CHAR_SET に指定した場合、Smartyクラスのインスタンス生成後は、元の設定値を前提として書かれたコードが正常に動かなくなるような…). また、それを継承する Smarty_Internal_TemplateBase クラスには fetch() や display() といった出力系のメソッドの他、プラグインやフィルタへのアクセスメソッドや registerObject(), getRegisteredObject() なども実装されています。 テンプレートの制御構文も "flexy:if" や "flexy:foreach" といったHTMLの属性として記述、テンプレートとして動作させる場合のみ要素を非表示にする "flexy:ignore" といった属性も用意されており、ピュアHTMLではないものの、デザイナーとの協業はしやすいテンプレートエンジンだと思います。, 修飾子の指定がなければ自動で htmlspecialchars() によるHTMLエスケープを行う仕様ですが、組込みの修飾子として以下のようなものが用意されています。, 今見ても、この修飾子のHTMLエスケープ仕様はなかなか実用性に優れていると思います。 修飾子と nofilter フラグが併記されている場合については、デフォルト修飾子は実行されませんが、テンプレート変数に明示された修飾子は実行されます。, 以下のように、全てのHTMLエスケープ機能を同時に利用した場合はどうなるのか、調査してみました。, 動作サンプル http://kholy.gehirn.ne.jp/php-advent/2012/4 ※Alert注意, Web上の議論を眺めると、セキュリティ上の理由から、自動で変数がHTMLエスケープされないテンプレートシステムは問題だ、といった論調が強いように感じます。 また、前述したデフォルト修飾子に指定することで、登録した修飾子プラグインを変数の展開時に自動的に実行することもできます。, 動作サンプル http://kholy.gehirn.ne.jp/php-advent/2012/5, このように、無名関数を修飾子プラグインとして登録してデフォルト修飾子に指定し、実行しようとすると…, libs/sysplugins/smarty_internal_compile_private_modifier.php にて 'Object of class Closure could not be converted to string' の Catchable fatal error (E_RECOVERABLE_ERROR) が発生してしまいます。, 組み込みの変数フィルタ以外にも、registerFilter() メソッドにより、ユーザー定義のコールバック関数を登録できます。, 動作サンプル http://kholy.gehirn.ne.jp/php-advent/2012/6, ただし残念ながら、こちらも現状では全てのcallableが利用できる訳ではありません。, このように、インスタンスメソッドのコールバック配列を変数フィルタに登録して実行しようとすると…, コンパイルしたテンプレートの実行時に Use of undefined constant StringConverter_escape - assumed 'StringConverter_escape' の Notice (E_NOTICE) が発生してしまいます。, libs/sysplugins/smarty_internal_templatebase.php にて 'Illegal offset type' の Warning (E_WARNING) が発生してしまいます。, 前述のように、修飾子プラグインと変数フィルタでユーザー定義関数を利用する際、現状では受け入れる関数の型がそれぞれ微妙に異なっており、無名関数についてはいずれも対応していません。 独自の修飾子プラグインの例が2つと、Smarty3のstring:リソースによる文字列のテンプレート、テンプレート継承の例が含まれています。, そういえば昨年の http://atnd.org/events/22781title=PHP Advent Calendar 2011 にも同じ11日目に書かせていただいたんですが、今年の初夏頃にレンタルサーバの契約継続をうっかり忘れてたせいで、URLを消失させてしまいまして…。 組み込みの変数フィルタとして htmlspecialchars が用意されており、これを loadFilter() メソッドで有効にします。, 動作サンプル http://kholy.gehirn.ne.jp/php-advent/2012/3, なお詳しくは後述しますが、変数フィルタは修飾子の次に実行されます。 SmartyはPHPで利用できるテンプレートエンジンです。Smartyを使うことで画面デザインとプログラム部分を分けて開発することが容易となります。ここではSmartyのインストールと実際の利用方法について確認していきます。 (自動で実行する手段としては機能的に重複しているのは確かですし、将来的にはどうなるか分かりませんが…), デフォルト修飾子を無効にする方法としてSmarty2で提供されていた {$variable|smarty:nodefaults} 廃止され、Smarty3では新たに {$variable nofilter} が追加されています。 修飾子(modifier)プラグイン関数から利用できるのはテンプレート変数の値のみですが、テンプレート関数(function)、ブロック関数(block)、コンパイラ関数(compiler)についてはフィルタと同様に Smarty_Internal_Template や Smarty のインスタンスが引数に渡されますので、まあ何でもやりたい放題ですね…。, このようなSmarty側の制約がありますので、他のテンプレートエンジンでも利用するような処理については、そのままプラグインの仕様に合わせて実装するのではなく、橋渡し役となるクラスを用意した方が良いように感じます。 (上記の例の場合、HTMLエスケープされた内容がmarquee要素として出力されます), 動作サンプル http://kholy.gehirn.ne.jp/php-advent/2012/7, このように、SmartyFunctionRegistry::set() で登録したコールバックを、修飾子プラグインの場合と同様に SmartyFunctionRegistry::filter() でSmartyのフィルタ形式に変換して取り出せます。, 複数の変数フィルタを登録した場合は、登録した順で全て実行されます。 一般ユーザのログイン処理の流れを説明します。 一� そのため、修飾子とは違って標準の関数名をそのままコールバックに設定することは事実上不可能ですし、第2引数以降のオプション引数を指定する手段もありません。 Everything except the individual modifier can be disabled with the nofilter flag. そのため、「ログイン」ボタンをクリックして、ログイン処理を実行した時点で保存され、ログイン処理に失敗した場合でも値が更新されます。 この機能が有効な場合、複数のユーザで同一のブラウザを利用している場合に別のユーザのユーザコードが初期表示されます。 この機能を無効にす� 使用したバージョンは Composer でインストールした dev-trunk = Smarty-3.1.12 ベースの開発版(2012年11月27日更新)です。, Smarty3ではテンプレート変数の展開時に何らかの処理を追加する方法が複数あります。, 自動で(暗黙的に)行うHTMLエスケープについては、この2つの組み込みプラグインを使う方法に加えて、バージョン3.1から追加された escape_html プロパティというのもあって、複雑な状況になっています。 昨日は Shusuke Otomo さんの 初めて Pull Request した話。 #phpadvent2012 | slumbers でした。, 皆さん、テンプレートエンジンは何を使ってますか? | (今回、修飾子プラグインと変数フィルタにおけるコールバック関数の型の制約を解決するために SmartyFunctionRegistry というものを用意したのも、そのような理由からです), 以上、長くなりましたが、Smarty3の組み込みのHTMLエスケープ方法と、修飾子プラグイン、変数フィルタについて紹介しました。, Smartyユーザーの中には「新しいテンプレートエンジンを使いたいのに、過去のしがらみで仕方なく使っている」という人もいるかもしれません。 せっかくなので、組み込みのエスケープ処理では不都合な場合に使える、これらの機能について紹介します。, 修飾子プラグインは組み込みの修飾子以外にも、registerPlugin() メソッドにより、ユーザー定義のコールバック関数を登録できます。 default_modifiers が廃止という情報がWeb上で散見されますが、そうではなく、$escape_html プロパティと変数フィルタという別の機能が追加されたのです。 PHP Advent Calendar 2012 11日目の記事です。昨日は Shusuke Otomo さんの 初めて Pull Request した話。 #phpadvent2012 | slumbers でした。 皆さん、テンプレートエンジンは何を使ってますか? おおっぴらに使ってますと発言するのもちょっと勇気が… 実用するには、コールバック関数の種別によってメソッド名を切り替えるか、マジックメソッドで呼ばれたメソッド名によって返すコールバックを切り替える処理が必要になるかと思います。, 変数フィルタの第2引数に渡される Smarty_Internal_Template クラスの継承関係は、以下のようになっています。, Smarty_Internal_Data ← Smarty_Internal_TemplateBase ← Smarty_Internal_Template, Smarty_Internal_Data クラスはプロパティに Smarty クラスのインスタンスを保持していて、Smartyテンプレート変数やテンプレートグローバル変数、Smarty設定値へのアクセスメソッドが実装されています。 この定数値は、Smartyクラスの静的プロパティ $_CHARSET にも自動的に設定されるのですが、更にmbstring拡張が有効な場合、Smartyクラスのコンストラクタにおいて、mbstring.internal_encoding(mbstringのデフォルトエンコーディング)として設定されます。, そして、組み込み変数フィルタの htmlspecialchars では htmlspecialchars(変数値, ENT_QUOTES, Smarty::$_CHARSET) のように $_CHARSET プロパティの値が利用されます。