地味な思いつきのメモです。
eval() 使ったらスゲェ簡単なのに…とか思いながら、
その強力さゆえに、恐ろしくて使えない場合が、間々ある。
いつも奥の手として持ってるだけみたいな。
良くあるのは、
'こんにちは、{$foo}さん。ようこそ{$bar}のホメパゲへ。'
みたいな文字列の中の変数に値を代入したいというやつ。正規表現とかでやってたら回りくどいので、
何とか eval() を活用するためにセキュリティ対策を考えてみた。
ヒアドキュメント使うのがキモ。
あと、ちゃんと意識して引用符「'」「"」を使い分けて、
1 回しか評価しないように気を付ける。
ついでに、境界識別子 '$_boundary' を予測し難くすれば、悪い事もやりにくかろう。
PHP だと、こんな感じ。
<?
function eval_vars_in_string($_string,$_vars)
{
extract($_vars);
$_boundary = uniqid('__');
$_code = '$_return = <<<'.$_boundary.'
'.$_string.'
'.$_boundary.';
';
eval($_code);
return $_return;
}
$_string = 'こんにちは、{$foo}さん。ようこそ{$bar}のホメパゲへ。';
$_out = eval_vars_in_string($_string,$_POST);
?>
という思い付きでした。[サンプル]
コメント歓迎。
