2009-08-22 33 views
0

警告:非常過時的問題與一個可怕的想法。存儲代碼,無論是PHP,JavaScript還是HTML,都不是一個好主意。在此僅留作文檔用途如何從數據庫執行php?

我有點尷尬的問題。

通常情況下,將東西放在數據庫中時,將以原樣保存。 因此,如果保存的東西是:

<?php echo "hi!"; ?> 

這將只是作爲輸出「你好!」當被調用時。
但是,在我的情況下,我將純文本保存到數據庫中。我沒有進行任何驗證來檢查這些代碼,並且我已經關閉了魔術引號以防止這些內容被轉義。

當從數據庫中獲取數據並將數據放入頁面(如果完全加載,所以PHP應該執行時,頁面之前的課程),這在源代碼中顯示爲?php標記,因此不可見(至少在Safari上),因爲它是一個不知名的輸出標籤。數據塊由一種'Joomla-ish'模板代碼組成。 HTML標籤,樣式(CSS),JavaScript塊和PHP都可以在那裏。像CSS,JS等東西的作品,但服務器端代碼不。

任何想法如何讓這個工作或爲什麼它不工作?數據庫位於mySQL和MyISAM中作爲存儲引擎。我保存的領域是一個長文。我使用的是php5(在w3c網站上聲明使用魔術引號並不是很好的做法,因爲它會在php6中被刪除,因爲除了解決一些問題外,它會帶來很多安全風險)。

我試過使用eval(),但有一個小問題。 eval()函數asumes這是php,但通常不會。它將主要是HTML和一些PHP塊。

回答

6

我建議不要在數據庫中存儲PHP。 數據庫用於數據,而不是代碼。

如果您需要有條件運行的代碼,請將其放入.php文件中並使用include()執行它。

如果你需要動態內容,你可以把它放在數據庫中,然後就是echo吧。無需使用eval()

不要忘記用htmlentities()來逃避輸出。

+1

我在想那件事。 – Samuel 2009-08-22 19:56:30

+2

確實:**警告團隊!極度危險!**。將PHP模板代碼放在數據庫中是非常不尋常的,除非你有一個出人意料的理由來做這件事,並且非常小心你的字符串轉義,這很有可能最終導致服務器被入侵。 – bobince 2009-08-22 20:31:49

1

如果我正確理解您的問題,您可能需要從數據庫中評估()內容。有關更多詳細信息,請參見eval documentation

如果代碼是「用戶創建的」,則可能需要將精簡的PHP執行環境設置爲沙箱。

+0

我應該怎麼做呢?並將PHP的exec()命令適合這個或是唯一適用的eval函數? – xaddict 2009-08-22 18:53:47

+0

$ output = eval($ txt_from_db_query);將解析並運行數據庫文本緩衝區中的PHP返回擴展的位 – 2009-08-22 19:20:26

1

,你不能只是讓

echo $phpcode; 

你需要使用eval。但請注意。你可能有很多安全問題。

1

eval語句將執行您在字符串中傳遞的PHP代碼。但是,您需要注意誰可以訪問數據庫中的數據,因爲在運行之前很難檢查代碼的安全性。