2012-05-14 18 views
0

私がしたいことは、htmlとPHPコードをデータベースから取り出して実行することです。だから、例えば私が持っていることがあります。私が欲しいものPHPコードを実行する文字列

<?php 
    $test = <<<END 
    <p> <?php 
    echo time(); 
    ?> </p> 
    END; 
    echo $test; 
?> 

ではなく、印刷の

<p> 12:00PM </p>     //right 

を印刷する$テストを得ることです:

<p> <?php echo time(); ?> </p> //wrong 

私はエコー機能を使用するときに発生するよう。

JavaScriptやその他の回避策で同じことをする方法を教えてください。代わりに質問に固執し、例が私の問題を示すための単なる例であることを忘れないでください。実際のコードははるかに複雑です。

私はJavascript string variable that contains PHP codeを見てきましたが、答えはありません。

おかげで、

ブレット

+2

奇妙なことに、なぜPHPコードをデータベースに格納していますか?それはある種のテンプレートシステムですか? –

+0

これはまさに@Jackです。これは、Webアプリケーションのテンプレート用です。 – Brett

+0

私は参照してください。もちろん、あなたが 'eval'を使うので、opcodeキャッシュからスピードアップすることはありません:) –

答えて

4

あなたは(evalを使用することができます)この

$test = <<<END 
<p> <?php 
echo time(); 
?> </p> 
END; 


ob_start(); 
eval("?>$test"); 
$result = ob_get_clean(); 
+1

これは間違いないが、ちょっとメモ...時にはPHPコードなしのデータベースhtmlとphpコード付きのいつものデータベースhtmlを持つことになるだろう。 ?> - あなたは逃げることができますか?> eval()から – RiquezJP

+0

素晴らしい1人のChris!これはうまく動作します。 – Brett

+0

ありがとう@RiquezJP助けてください。 – Brett

1

のためにこのような何かが役に立つかもしれない...

<?php echo writedata($code_to_parse); ?> 

<?php 
function writedata($data){ 
    if(substr($data,0,2)=="?>"){ 
     eval($data); 
    // eval will run & echo the code immediately, so return an empty $code 
    $code=""; 
}else{ 
    $code="$data"; 
} 
return $code; 
} 
?> 

今、あなたは扱うことができます普通のhtmlの&とphp/htmlの混在した関数呼び出しです。

サンプルデータ:

?>Bonjour. The time now is <?php echo $timenow; ?> in Paris. 

<div class="bluebox">Perfect day for swimming</div> 

にevalを(使用して、いくつかの副作用がありますが)、それは、すぐにそれを呼び出すこととして実行されますので、時々予期しない結果が生じる可能性があります覚えています。

6

お願いしたいことをすることを強くお勧めします。これには非常に多くの理由があります。

質問に対する回答は、他の人の回答によれば、eval()です。しかし、eval()にはいくつかの大きな問題があります。

まず、質問のコメントからフォローアップするために、それを実行するコードは通常のPHPコードよりも大幅に遅く実行されます。 PHPはスクリプト言語ですが、より速く実行できるように最適化されています。これらの最適化は、スクリプトエンジンが実際にコードを実行するまでどのように見えるかを知ることができないため、評価ブロックでは機能しません。

データベースからコードをロードするだけでなく、通常のinclude()ステートメントを使用してファイルから読み込むよりも処理速度が遅くなります。

第2に、eval()は、あなたが持つことができる最大のセキュリティの頭痛の一つです。 eval()ステートメントは PHPコードが実行されます。つまり、攻撃者がコードを操作して何かを実行できるようになります。サーバ上ではが実行されます。一言で言えば、コード内の単一のeval()文は、マイナーハックを致命的なものに変える可能性があります。

あなたのコンセプトを変更しすぎることのない代替ソリューションの1つは、PHPコードをDBではなくファイルに保存することです。これにより、適切なタイミングで簡単にinclude()とすることができ、前述のスピードの問題を解消します。もしあなたが望むなら、それを保存するためにDBを使用することができ、それをcronジョブなどを使ってキャッシュファイルにエクスポートしたり、ファイルに直接保存することもできます。

ただし、この解決策では必ずしもセキュリティリスクが排除されるとは限りません。あなたはまだ効果的に任意のコードを実行しています。これは、ハッカーが比較的単純なハックで多くの被害を被る可能性があることを意味します。

ユーザ入力PHPコードをソフトウェアに入力する必要がある理由を再考することをお勧めします。

+0

ありがとう本当にありがとうございます。問題を明確に説明し、いくつかの解決方法を提案しました。あなたが持っているように、より多くの人々が反応してほしいです。本当にありがとう。 – Brett

関連する問題