PHP5。 安全なテンプレート

これまで、私はSmartyなどの外部テンプレートエンジンを使用していません。 メインの「アクティブな」テンプレート、つまり コンテンツゾーンのデータが呼び出され、単純なHTMLの形式で挿入されたPHPファイルだけです(この場合の形成方法は重要ではありません)。 「ボックス化」されておらず、実際にはユーザー権限が分離されていない以前のバージョンのCMSでは、この側面は特に面倒ではありませんでした。 しかし、それに応じて、管理パネルにアクセスできる人は、このファイル内の任意のphpコードを詰め込むことができます。 CMSの新しいバージョンでは、これは受け入れられません。なぜなら、 これは実際には権利の輪郭を描くための回避策です。 そのため、このような「安全でない」テンプレートを放棄することが決定されました。



最小限の「外部」ソリューションを使用した、最も単純でエレガントなソリューションを探して、PHPに組み込まれたXSLTプロセッサー( XSLTProcessor )の注目すべき機能の1つを思い出しました。 つまり-変換でのPHP関数の使用。これらの関数のリストを制限できます。 これがまさに必要なことです。



例に移りましょう。



標準の「アクティブ」テンプレートは次のようになりました。



<? php <br>$ main_ctx = CMSContentObj::getInstance () - > getData("main_ctx");<br>$title = CMSContentObj::getInstance()- > getTitle();<br>// <br>? > <br> < html > <br> < head > <br> < meta content ="text/html; charset=utf-8" http-equiv ="Content-Type" /> <br> < title ><? =$title;? > - mysite.ru </ title > <br> < link href ="/_css/main.css" rel ="stylesheet" type ="text/css" > <br> < script type ="text/javascript" src ="/_js/jquery.js" ></ script > <br> </ head > <br> < body > <br>…<br> <? =$main_ctx;? > <br>…<br> </ body > <br> </ html > <br> <br> * This source code was highlighted with Source Code Highlighter .







つまり 名前付きHTMLデータは、コンテンツから取得され、HTMLコードに挿入されるだけです。



XSLの場合、テンプレートは次のようになります。



<? xml version ="1.0" encoding ="utf-8" ? > <br> < xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" xmlns:php ="http://php.net/xsl" > <br> < xsl:output encoding ="utf-8" indent ="yes" method ="html" /> <br> < xsl:template match ="/page" > <br> <!-- <br> Variables <br> --> <br> < xsl:variable name ="title" select ="php:function('CMSStaticContent::getTitle')" /> <br> < xsl:variable name ="main_ctx" select ="php:function('CMSStaticContent::getData','main_ctx')" /> <br> <!-- <br> / Variables <br> --> <br> < html > <br> < head > <br> < meta content ="text/html; charset=utf-8" http-equiv ="Content-Type" /> <br> < title >< xsl:value-of disable-output-escaping ="yes" select ="$title" /> - mysite.ru </ title > <br> < link href ="/_css/main.css" rel ="stylesheet" type ="text/css" /> <br> < script type ="text/javascript" src ="/_js/jquery.js" /> <br> </ head > <br> < body > <br> …<br> < xsl:value-of disable-output-escaping ="yes" select ="$main_ctx" /> <br> …<br> </ body > <br> </ html > <br> </ xsl:template > <br> </ xsl:stylesheet > <br> <br> * This source code was highlighted with Source Code Highlighter .







思わない?



LS:何らかの理由で、CMSContentObj :: getInstance()-> getTitle()の形式の構造を使用することに成功しなかったため、膝に中間クラスCMSStaticContentを作成する必要がありました。



class CMSStaticContent {<br> public static function __callStatic($name, $arguments) {<br> $cms = CMSContentObj::getInstance();<br> if (method_exists($cms, $name)) {<br> return call_user_func_array(array($cms, $name), $arguments);<br> } else {<br> throw new Exception();<br> }<br> }<br>}<br> <br> * This source code was highlighted with Source Code Highlighter .







さて、空のXMLを作成し、関数を登録し、変換を行うのは、たとえば次のようになります。



$doc = new DOMDocument();<br>$doc->loadXML( '<page/>' );<br>$xsl = new DOMDocument();<br>$xsl->load($xsl_template);<br>$proc = new XSLTProcessor();<br>$proc->registerPHPFunctions(array('CMSStaticContent::getData', 'CMSStaticContent::getTitle'));<br>$proc->importStyleSheet($xsl);<br>echo $proc->transformToXML($doc);<br> <br> * This source code was highlighted with Source Code Highlighter .







まあ、それがすべてです。 変換中に実行できるPHP関数は限られているため、このようなテンプレートを使用すると、システムにアクセスできません。



PS:外部テンプレートエンジンはありません。



All Articles