0

私がやりたいことは、データベースから html と PHP コードを取り出して実行することです。たとえば、次のような場合があります。

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

私が欲しいのは、 $test を印刷することです

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

印刷する代わりに:

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

エコー機能を使用すると発生します。

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

PHPコードを含むJavascript文字列変数を見てきましたが、どれもうまくいきません。

ありがとう、

ブレット

4

3 に答える 3

7

あなたが求めていることをしないことを強くお勧めします。これには多くの正当な理由があります。

質問への答えは、他の人が言ったように、使用することeval()です。ただし、eval()いくつかの大きな問題があります。

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

それだけでなく、データベースからコードをロードすると、通常のinclude()ステートメントを使用してファイルからコードをロードするよりも遅くなります。

2 つ目eval()は、セキュリティに関する最大の頭痛の種の 1 つです。eval()ステートメントは、与えられた任意のPHP コードを実行します。つまり、攻撃者はコードを操作して、サーバー上で何でもできるようになります。要するに、eval()コード内の 1 つのステートメントが、マイナーなハッキングを壊滅的なものに変える可能性があります。

概念をあまり変更しない代替ソリューションの 1 つは、PHP コードを DB ではなくファイルに保存することです。これにより、適切なタイミングで単純include()化することができ、上記で説明した速度の問題が解消されます。必要に応じて DB を使用して保存し、cron ジョブなどを使用してキャッシュ ファイルにエクスポートするか、ファイルに直接保存することができます。

ただし、このソリューションは必ずしもセキュリティ リスクを排除するものではありません。事実上、任意のコードを実行しているということは、ハッカーが比較的単純なハッキングで多くの損害を与える可能性があることを意味します。

したがって、ユーザー入力の PHP コードをソフトウェアに入力できるようにする必要がある理由を再考することをお勧めします。

于 2012-05-14T19:27:59.147 に答える
4

これにはeval () を使用できます

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


ob_start();
eval("?>$test");
$result = ob_get_clean();
于 2012-05-14T04:24:25.400 に答える
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 のいずれかを 1 つの関数呼び出しで処理できるようになりました。

サンプルデータ:

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

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

eval() を使用すると、いくつかの副作用があります。呼び出すとすぐに実行されるため、予期しない結果になることがあります。

于 2012-05-14T05:16:08.190 に答える