讓我通過說我明白在服務器環境中運行用戶提供的代碼是有風險的。幽默我 - 我的問題是特定於字符串評估和可以在該上下文中執行的語言的子集。PHP安全性:評估用戶輸入的字符串的風險
所以我現在正在建立一個模板生成系統,我希望它快。超級,超級,超級快。這件事將會因爲大量的電子郵件廣告和那種事情而受到打擊。我使用的方法是爲用戶提供用戶輸入的模板標籤,在存儲前通過正則表達式轉換爲PHP變量替換。假設我的正則表達式是防彈的,你覺得這個過程的安全性是可以接受的嗎?
- 模板由用戶輸入,標籤類似
[[contact.name]]
等。 - 保存後,正則表達式將它們轉換爲PHP變量,因此上述通配符在模板字符串中變爲
{$contact['name']}
。 - 我們還檢查是否存在任何可以從超全局範圍轉換爲可訪問變量的東西,因此
[[_SERVER]]
,[[GLOBALS]]
等以及[[this
都被禁止並記錄爲黑客企圖。 - 在雙引號字符串(
$
,"
和\
)中具有特殊含義的其他字符也會被轉義。 - 生成過程如下:
- generation是一個運行的類方法。傳入的唯一變量是
$contact
,它是一個數組。 - 模板字符串被讀出到另一個局部變量(在這種情況下,
$__templateString
)。用戶理論上可以在他們的模板中訪問這個變量,但是他們是否確實無關緊要 - 不是安全風險,只是愚蠢的。 - 的代碼生成模板是後來乾脆
eval('return "' . $__templateString . '";');
- generation是一個運行的類方法。傳入的唯一變量是
的洞穴,我在這裏失蹤?我很確定唯一的潛在風險是範圍訪問的問題,我想我已經覆蓋了我所有的基地。
我不知道,但像鍵盤的地方做。我經常想知道如何。 – 2012-03-22 02:01:37
@Dagon https://github.com/Viper-7/Deployable-PHP-Codepad的chrooting和鎖定系統權限的腳本執行作爲用戶。這比'eval'更精細。 – deceze 2012-03-22 06:24:22
如果你想要的東西,快捷,安全的,那麼你應該使用[handelbars(http://handlebarsjs.com/),然後用[HIPHOP(https://github.com/facebook/hiphop-php/)編譯PHP,我們真的不需要另一個聰明人。 – rook 2012-03-22 06:51:02