2013-07-06 28 views
0

我試圖讓一個bb代碼選項從數據庫文本字段運行php代碼。 像[?php]code[/?]從文本框的形式運行一個PHP命令

我知道這是不安全的,但沒有人可以編輯的頁面,我主要是想用它來讓它計算的東西或包括一個文件。

這是我SOFAR:

$txt = preg_replace("#\[?php\](.+?)\[/?\]#is", eval("\\1"), $txt); 
+1

然後真的 - 你應該想辦法做,沒有運行任意代碼。想要做一個計算,爲BB標籤內的內容使用一個解析器,想要包含一個文件,使用特定的語法。如果您的數據庫受到威脅,假設沒有人可以編輯它,但假定它是基於虛假的,並且會打開您的服務器以容易受到攻擊。 – Jon

+0

那麼我會如何以這種方式包含文件呢? – Coolcrab

回答

0

您提供爲eval()不起作用的例子preg_replace()前評估,其結果實際上是作爲替代品。 \\1不是一個有效的PHP表達式,所以我期望給定的代碼將返回一個分析錯誤。

您應該首先使用preg_match()來提取一個PHP表達式,然後eval()它,然後只用bb標籤之間的文本替換eval()的結果。

這就是說,正如上面評論的那樣,我個人會強烈建議不要這樣做。這基本上提供了對服務器的任意訪問權限,並且以任何方式是一個非常糟糕的設計理念。我想你真的只需要一定數量的操作,比如包含來自特定目錄的頁面。您可以專門爲有限數量的操作實施專門的bb標籤,並採取一切預防措施。

+0

然後你會如何製作包含標籤?由於我找不到比eval更好的運行php – Coolcrab

0

你可以開始緩衝,eval整串,首先關閉PHP的標籤,並獲得緩衝區爲變量:

$txt = "Result of 2+2 = [?php] echo 4; [/?]."; 

$txt = str_replace(array('[?php]', '[/?]'), array('<?php','?>'), $txt); 
ob_start(); 
eval('?>'.$txt); 
$txt = ob_get_contents(); 
ob_end_clean(); 

echo $txt;