2008-09-03 43 views
28

我正在嘗試編寫一個調用存儲在MySQL數據庫中的PHP的頁面。存儲在MySQL數據庫中的頁面包含我想在頁面加載時運行的PHP(和HTML)代碼。如何執行存儲在MySQL數據庫中的PHP?

我該怎麼去做這件事?

+8

感謝您的回答。與下面的許多「答案」相反,這是一個很好且有用的答案。有很多LEGIT用法,您希望將PHP命令存儲在數據庫中。在不知道情況下說「不這樣做」只是傲慢而已。 – 2013-03-27 02:34:03

回答

30

您可以使用eval命令。 雖然我會推薦這個,因爲使用這種方法存在很多陷阱。調試很難(er),它意味着一些安全風險(DB中的壞內容被執行,呃哦)。

例如參見When is eval evil in php?。谷歌for Eval是邪惡的,你會發現很多例子,爲什麼你應該找到另一種解決方案。

補充:另外一篇很好的文章,其中有一些引用漏洞的文章是this blogpost。指的是過去的vBulletin和phpMyAdmin漏洞,這些漏洞是由於Eval使用不當造成的。

+0

摘自「Eval is evil」:「允許任何用戶提供的數據進入eval()調用都是要求被黑客攻擊。」 - 好的,如果我使用我自己的代碼保存在數據庫中並使用爲動態和快速的自定義表單生成? – Jeffz 2013-05-10 14:38:00

+0

@Jeffz你最好確定沒有錯誤的代碼在那裏結束。此外,你爲什麼要把它粘在一個數據庫中,而不僅僅是一些代碼文件中? – 2013-05-10 16:36:42

+0

兩種方式都很好,如果你知道你在做什麼; [一個]。基於文件更安全(特別是對於編碼相當新穎),[B]。數據庫的方式是更多功能,如果一些飛行中的代碼更改是必要的,因爲更新數據庫比更新更容易,調整(無論)文件的內容 – Jeffz 2013-07-07 13:18:01

2

你可以看看PHP中的eval函數。它允許你運行任意的PHP代碼。然而,這可能是一個巨大的安全風險,並且最好避免。

5

eval()函數在這裏的其他答案中已被涵蓋。我同意你應該限制使用eval,除非它是絕對需要的。您可以只使用名爲​​的方法,而不使用db中的PHP代碼。無論何時您需要運行自定義PHP代碼,只需實例化剛剛從db中獲取的名稱類並在其上運行->execute()即可。這是更清潔的解決方案,併爲您提供了極大的靈活性,並顯着提高了網站安全性。

1

您是否考慮過使用源代碼管理系統爲各種安裝(以及它們之間不同的模塊)存儲不同的分支?這將是我能想到的應用程序配置的幾個最佳實踐之一。你的並不是一個不尋常的要求,所以這是一個過去被其他人解決的問題。並將代碼存儲在數據庫中是我認爲你很難找到引用或被建議爲最佳實踐。

你發佈了澄清的好事。你可能無意中提出了一個答案來尋找一個合適的問題。

22

簡單:

$x // your variable with the data from the DB 
<?php echo eval("?>".$x."<?") ?> 

讓我知道,在許多應用中爲我的偉大工程,不能不注意到,每個人都快點說,這是多麼糟糕,但速度緩慢實際上助陣用直接回答...

0

我如何做到這一點是在數據庫中有一個字段,用於標識需要執行的代碼塊的唯一性。那個單詞在該代碼的文件名中。我把字符串放在一起指向要包含的php文件。例如:

$lookFor = $row['page']; 

include("resources/" . $lookFor . "Codebase.php"); 

這樣,即使黑客可以訪問你的DB,他也不能將惡意代碼直接放在那裏執行。他也許可以改變這個引用詞,但是除非他能夠直接將文件直接放到服務器上,否則這對他沒有好處。如果他可以將文件直接放到服務器上,那麼無論如何,如果他真的想要變得討厭的話,你就會沉沒。只是我的兩美分價值。

是的,有理由想要執行存儲的代碼,但也有缺點。

0

從數據庫中讀取php代碼並將其保存爲具有唯一名稱的文件,然後包含文件 這種用於運行php代碼和調試的簡單方法。

$uniqid="tmp/".date("d-m-Y h-i-s").'_'.$Title."_".uniqid().".php";  
$file = fopen($uniqid,"w"); 
fwrite($file,"<?php \r\n ".$R['Body']); 
fclose($file);       
// eval($R['Body']); 
include $uniqid; 
相關問題