Вопрос по php, string, echo – Строковая переменная для выполнения кода PHP

0

Я хочу извлечь html и PHP-код из базы данных, а затем выполнить его. Так, например, я могу иметь:

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

Я хочу получить $ test для печати

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

вместо печати:

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

как происходит, когда я использую функцию эха.

Пожалуйста, не говорите мне, как сделать то же самое с JavaScript или другим способом. Вместо этого придерживайтесь вопроса и помните, что пример - это просто пример, демонстрирующий мою проблему. Фактический код намного сложнее.

Я смотрел наСтроковая переменная Javascript, содержащая код PHP но ни один из ответов не работает.

Спасибо,

Brett

APC например:php.net/apc Ja͢ck
Любопытно узнать, почему вы храните код PHP в базе данных? Это какая-то система шаблонов? Ja͢ck
Это именно то, что @Jack, это для шаблона для веб-приложения. Brett
Понимаю. Конечно, потому что вы используетеeval вы также не получите никакого ускорения от кэшей кода операции :) Ja͢ck
Извините, @Jack, что такое кеши кода операции Brett

Ваш Ответ

3   ответа
6

что вы просите. Есть несколько очень веских причин для этого.

Ответ на вопрос, как уже говорили другие, заключается в использованииeval(), Тем не мение,eval() имеет несколько основных проблем с этим.

Во-первых, чтобы прокомментировать комментарии к вопросу, код, выполняемый через него, выполняется значительно медленнее, чем обычный код PHP. Хотя PHP является скриптовым языком, он имеет оптимизации для ускорения работы. Ни одна из этих оптимизаций не работает для блока eval, поскольку механизм сценариев не может знать, как будет выглядеть код, до тех пор, пока он фактически не запустит его.

Мало того, но загрузка кода из базы данных также будет медленнее, чем загрузка его из файла с помощью обычногоinclude() заявление.

Во-вторых,eval() это одна из самых больших проблем безопасности, которую вы можете иметь.eval() заявление будет работатьany PHP-код предоставляется, это означает, что злоумышленник может манипулировать кодом сможет сделатьanything на вашем сервере. Короче говоря, одинeval() Заявление в вашем коде может превратить незначительный взлом в катастрофический.

Одним из альтернативных решений, которое не требует слишком большого изменения вашей концепции, было бы сохранение кода PHP в файл, а не в БД. Это позволит вам простоinclude() это в надлежащее время, и устранит проблемы скорости, обсужденные выше. Вы можете по-прежнему использовать БД для ее хранения, если хотите, и экспортировать ее в файл кэша, используя задание cron или аналогичное, или просто сохранить его непосредственно в файл.

Однако это решение не обязательно устраняет риски безопасности. Вы по-прежнему будете эффективно выполнять произвольный код, что будет означать, что хакер может нанести большой урон при относительно простом взломе.

Поэтому я бы порекомендовал переосмыслить, почему вам нужно разрешить вводить пользовательский код PHP в свое программное обеспечение.

Error: User Rate Limit Exceeded 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 & amp; смешанный php / html с одним вызовом функции.

Пример данных:

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

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

Есть некоторые побочные эффекты при использовании eval (), помните, что он будет выполняться сразу после его вызова, поэтому иногда может иметь неожиданные результаты.

4

Ты можешь использоватьEval() за это

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


ob_start();
eval("?>$test");
$result = ob_get_clean();
Error: User Rate Limit Exceeded Brett
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Brett

Похожие вопросы