2012-03-22 52 views
2

讓我通過說我明白在服務器環境中運行用戶提供的代碼是有風險的。幽默我 - 我的問題是特定於字符串評估和可以在該上下文中執行的語言的子集。PHP安全性:評估用戶輸入的字符串的風險

所以我現在正在建立一個模板生成系統,我希望它快。超級,超級,超級快。這件事將會因爲大量的電子郵件廣告和那種事情而受到打擊。我使用的方法是爲用戶提供用戶輸入的模板標籤,在存儲前通過正則表達式轉換爲PHP變量替換。假設我的正則表達式是防彈的,你覺得這個過程的安全性是可以接受的嗎?

  • 模板由用戶輸入,標籤類似[[contact.name]]等。
  • 保存後,正則表達式將它們轉換爲PHP變量,因此上述通配符在模板字符串中變爲{$contact['name']}
  • 我們還檢查是否存在任何可以從超全局範圍轉換爲可訪問變量的東西,因此[[_SERVER]],[[GLOBALS]]等以及[[this都被禁止並記錄爲黑客企圖。
  • 在雙引號字符串($,"\)中具有特殊含義的其他字符也會被轉義。
  • 生成過程如下:
    • generation是一個運行的類方法。傳入的唯一變量是$contact,它是一個數組。
    • 模板字符串被讀出到另一個局部變量(在這種情況下,$__templateString)。用戶理論上可以在他們的模板中訪問這個變量,但是他們是否確實無關緊要 - 不是安全風險,只是愚蠢的。
    • 的代碼生成模板是後來乾脆eval('return "' . $__templateString . '";');

的洞穴,我在這裏失蹤?我很確定唯一的潛在風險是範圍訪問的問題,我想我已經覆蓋了我所有的基地。

+0

我不知道,但像鍵盤的地方做。我經常想知道如何。 – 2012-03-22 02:01:37

+0

@Dagon https://github.com/Viper-7/Deployable-PHP-Codepad的chrooting和鎖定系統權限的腳本執行作爲用戶。這比'eval'更精細。 – deceze 2012-03-22 06:24:22

+0

如果你想要的東西,快捷,安全的,那麼你應該使用[handelbars(http://handlebarsjs.com/),然後用[HIPHOP(https://github.com/facebook/hiphop-php/)編譯PHP,我們真的不需要另一個聰明人。 – rook 2012-03-22 06:51:02

回答

1

那麼,如果我進入這個模板:

" . mysql_query('DROP TABLE users') . " 

這是很好,你是防範可能獲得變量,你不希望人們訪問,但eval評估所有代碼,而不是隻是變量。並嘗試找到一個正則表達式來過濾出...

+0

好吧,這將是好的,因爲我把它放回到它們之間之前從字符串中剔除雙引號。因此,上述所做的全部輸出與寫入模板完全相同。 – pospi 2012-03-22 06:06:38

+0

好吧,'{$(的mysql_query()}}'即可。[這是有效的字符串。(http://www.php.net/manual/en/language.types.string.php#language.types.string .parsing)我想要說的是,試圖鎖定'eval'是一場艱苦的戰鬥,你必須意識到所有可能的代碼執行方式(並且有很多這樣的方法)你必須嘗試用一個正則表達式來鎖定每一個,這對異常是有例外的,你只對'eval'的一個微小方面感興趣,但是需要對付最後一個不希望的副作用。理智的方式來發展。 – deceze 2012-03-22 06:14:14

+0

哦,好趕上。我不知道,語法是可能的。但說真的,我知道這是不是一個特別*理智*的路要走,但字符串解析的頁面理論上應該是惟一需要的信息以確保它的安全(在我來到這裏之前,我應該一直讀到底),但我知道人們原則上總是避免這種事情,但我收費我喜歡如果你是一個語言老將,並有足夠的信心去嘗試它,那麼爲什麼不呢?當你發現自己不應該如此自大時,你就應該準備好吃掉你的話語。 – pospi 2012-03-22 09:59:06

1

軼事傳聞:當我是一個Linux發行版的安全聯繫人時,PHP開發人員要求我們停止調用錯誤輸入「安全漏洞」的解釋器崩潰。他們堅持認爲,誰提供的腳本是100%的信任,我會完全相信eval()被同樣的方式處理。

你可以嘗試修補過的問題,但我肯定不會打開輸入到無限的用戶。你可以俯瞰一個解釋 - 崩潰的bug的機率實在太高了。

此外,考慮與一個mandatory access control系統如AppArmorSELinuxTOMOYO,或SMACK部署。這樣你可以restrict the potential damage from a hacked input to the minimal amount of resources necessary to do the work in the first place。 (自2000年以來,我一直在AppArmor上工作,所以這將是我在許多環境中的首選,但考慮其他人,他們都是高質量的產品,旨在解決不同的問題,其中一個或另一個可能更適合您的環境。)