« 2007年12月 | トップ | 2008年02月 »

2008年01月11日

Zend_Viewでescapeを勝手にやるための試行錯誤  このエントリをはてなブックマークに登録 

Zend_View を使っていて、ビュースクリプトで都度都度 $this->escape($this->hoge) みたいな事をやるのがいやなので、試行錯誤。Zend_View_Abstractを継承したMy_Viewを作ってみました。

<?php

class My_View extends Zend_View_Abstract { public $autoEscape = true;
protected function _run() { $varBackup = null; if($this->autoEscape) { $vars = $this->getVars(); $varBackup = $vars;
foreach($vars as $k => $v) { if (is_string($v)) { $this->assign($k . '_raw', $v); $this->$k = $this->escape($v); } elseif (is_array($v)) { $this->$k = $this->_arrayEscape($v); $this->{$k . '_raw'} = $v; } } }
include func_get_arg(0);
if($varBackup !== null) { $this->clearVars(); $this->assign($varBackup); } }
private function _arrayEscape($vs) { foreach($vs as $k => $v) { if (is_string($v)) { $vs[$k] = $this->escape($v); } elseif (is_array($v)) { $vs[$k] = $this->_arrayEscape($v); } } return $vs; } }

こんな感じです。
使い方は、

// setup view
$view = new My_View();
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

みたいな感じで(ViewRendererは使わなくてもいいけど)、あとはアクションの中などで、

// 変数
$this->view->hoge = 'ほげ<br />ほげ';
// 配列
$tmp = array('aaa', 'bbb<br />bbb');
$this->view->hoge_array = $tmp;

とセットする。
ビュースクリプトの中では、エスケープ済みのものと、エスケープしないものがそれぞれ、

<!-- エスケープ済み変数 -->
<?php echo $this->hoge; ?>

<!-- エスケープなし変数 --> <?php echo $this->hoge_raw; ?>
<!-- エスケープ済み配列 --> <?php echo $this->hoge_array[0]; ?> <?php echo $this->hoge_array[1]; ?>
<!-- エスケープなし配列 --> <?php echo $this->hoge_array_raw[0]; ?> <?php echo $this->hoge_array_raw[1]; ?>

みたいな感じ。多重配列も同じような感じ。

単純な用途の場合はこれはこれでいいのだけれど、いろいろとZend Frameworkのソースやドキュメントを追っていくと、自動でエスケープすると、却ってフォーム関係のView_Helperが使いづらくなりそうだったり、毎回別名の変数や配列を生成したりして、どうなのと思うところもあり。何か良いアイデア合ったら教えてください。

ビュースクリプト側でエスケープを書きたくないというのは、もちろん、不注意からXSSを生み出してしまわないためなのですが、そのためにややこしくなるのもいやなので、Viewにセットする段階で、フィルターかましてエスケープしてあげるほうがいいのかなぁとも思っています。

なるべくZend Frameworkの素のままで使ってみようと思ってましたが、やはりSmartyと、Smartyのプラグインを使ってViewまわりを固めたほうが早いかなと思って、現在そっち方面で検討中。

ViewRendererとかは結構便利なので、Zend Frameworkの良い所を生かしつつ。
ということで、Smartyを使ったViewの話は次回にします。

投稿者 田中@グリニッジ : 21:08 | コメント (0) | トラックバック

PHPのソースコードを貼り付けるために  このエントリをはてなブックマークに登録 

PHPのこのソースコードを貼り付けるために、よく他のブログとかでやっているような方法を行おうと調べてみて、ちょっと古いエントリだけれども、

ブログにコードを貼り付ける方法で悩むの巻

を参考にスタイルシートを変更してみた。

pre.code{
	display:block;
	background : #EEE;
	color : #444;
	font-size : 1em;
	margin  : 1em;
	padding : 0.5em;
	border  : 1px solid #CCC;
	width   : 90%;
	overflow : scroll;
}

こんな感じ。

実態参照に変換するために
MovableType用EntityRefButtonプラグイン v0.0.5
も入れました。

エントリーを書くのがかったるくて、覚書みたいなものをあちらこちらに散乱させていたけれど、これでちゃんと書きたいものが書けるようになるかな。あとでソースコードに色も付けちゃおう。

投稿者 田中@グリニッジ : 20:16 | コメント (0) | トラックバック