簡體   English   中英

用於執行PHP代碼的字符串變量

[英]String variable to execute PHP code

我要做的是從數據庫中提取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

當我使用echo函數時發生的情況。

請不要告訴我如何使用JavaScript或其他解決方法來做同樣的事情。 相反,請堅持該問題,並記住該示例只是演示我的問題的示例。 實際的代碼要復雜得多。

我查看了包含PHP代碼的Javascript字符串變量,但沒有答案可用。

謝謝,

布雷特

我強烈建議您不要執行您要執行的操作。 有很多非常好的原因。

正如其他人所說,該問題的答案是使用eval() 但是, eval()有幾個主要問題。

首先,要對問題的注釋進行跟進,執行該問題的代碼的執行速度比常規PHP代碼要慢得多。 盡管PHP是一種腳本語言,但是它確實有一些優化可以使運行更快。 這些優化都不適用於eval塊,因為腳本引擎在實際運行之前不知道代碼是什么樣。

不僅如此,從數據庫中加載代碼也比使用常規include()語句從文件中加載代碼要慢。

其次, eval()是您可能遇到的最大安全難題之一。 一個eval()語句將運行給出的任何 PHP代碼,這意味着攻擊者可以操縱該代碼將能夠在您的服務器上執行任何操作。 簡而言之,您的代碼中只有一個eval()語句可以將小型黑客變成災難性的黑客。

一種無需過多更改概念的替代解決方案是將PHP代碼保存到文件而不是數據庫中。 這將允許您在適當的時間簡化include() ,並消除上面討論的速度問題。 如果願意,您仍然可以使用數據庫來存儲它,並使用cron作業或類似的方法將其導出到緩存文件中,或者直接將其保存到文件中。

但是,此解決方案不一定消除安全風險。 您仍然可以有效地運行任意代碼,這仍然意味着黑客可以通過相對簡單的黑客造成很多損失。

因此,我建議您重新考慮為什么需要允許將用戶輸入的PHP代碼輸入到您的軟件中。

您可以為此使用eval ()

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


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

這樣的事情可能會有用...

<?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()有一些副作用,請記住,它將在調用后立即執行,因此有時可能會產生意想不到的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM