4

次のようなプレーンテキストのみが含まれている可能性のあるmysql行の「コンテンツ」レコードからphpコードを返す方法:

Hello!

または/およびphpのような:

Lets try some php: <?php echo phpinfo(); ?>

プレーンテキストのみが含まれている場合、ケーシング速度のパフォーマンスはありませんか?


include() を使用して php を返す場合の例を次に示しますが、この場合は私が求めているものではありません(すべてのコンテンツ php が mysql から取得される場合を求めています)。

mysql レコード:

+---------------+
| id |  content |
|---------------|
|  0 | test.php |
+---------------+

test.php コンテンツ<?php echo phpinfo(); ?>

mysql トラフ include() から php を返そうとしています:

$result=mysql_query("SELECT content FROM test WHERE id=0");
while($row=@mysql_fetch_array($result,MYSQL_ASSOC)){
    $row[]=array('row'=>array_map('htmlspecialchars',$row));
    $content=$row['content'];
    ob_start();
    include $content;
    $content=ob_get_contents();
    ob_end_clean();
    echo $content;
}
mysql_close($con);
4

2 に答える 2

4

レコードの内容を評価してみてください。eval($row['content']);

補足:あなたのケースにはhtml + phpコードが混在しており、これはPHPモードを終了するために終了PHPタグを使用する必要があることを意味します。したがって、特定のケースでは、これは次のようになります。

eval( '?>'. $row['content'] .'<?php ' );

注:いくつかの問題があるため、開始タグの後に余分なスペースを残してください:http ://www.php.net/manual/en/function.eval.php#97063

于 2011-06-28T19:05:27.423 に答える
1

DB 内の PHP コードは最悪ですが、雇用主がそれを回避するような方法でシステムを書き直すことを許可しなかったため、これを行わなければならない状況が以前にもありました。そこで、使用したソリューションの一般的なバージョンを次に示します。 :

$string = 'this <?php echo "is not"; ?> cool';

function exec_php($php_string) {
    return preg_replace_callback(
        '/<\?(?:php)?(.*)\?>/m',
        'exec_php_embed',
        $string
    );
}

function exec_php_embed(array $args) {
    if (count($args) != 2) {
        return '';
    }
    list(,$code) = $args;
    ob_start();
    eval($code);
    return ob_get_clean();
}

注:これには非常に注意してください! これでユーザー生成コンテンツを実行しないでください! 早めの交換を心がけましょう!

使い方eval()は効率が悪いだけでなく、少しでも使い方を誤ると危険です。上記のようなものを使用することは強くお勧めしませんが、差し迫った問題の解決策になると思います. それ自体がこれ以上問題を引き起こさないことを保証するものではありません ;)

GNUが言うように:

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
于 2011-06-28T19:13:04.140 に答える