2010-10-29 99 views
2

我在製作CMS,可以由第三方開發人員進行擴展。在過去,我對新手開發者一直忽略安全問題存在問題。當他們將模塊放在我的網站上時,它們可能會損害用戶的網站。PHP - 清理所有數據?

我想創建一個全局對象。這將覆蓋所有全局消息的副本。這可能會導致問題,所以這個對象也將提供一個選項來獲取unsanitized數據。

這樣,默認情況下,開發者在理論上可以做這樣的事情,它的效果不會像通常那樣糟糕。 (顯然,這仍然可能導致問題但是表不會被丟棄,數據不會被暴露出來。)

mysql_query("INSERT INTO users (`name`) VALUES ('{$_POST['name']}')"); 

這並不能防止開發商故意誰試圖打破東西。但是,這將有助於消除基本的錯誤。

將按如下方式訪問結束對象。

$_POST['key']; // Provides Sanitized version of the post key. 
$obj->post('key'); // Provides Sanitized version of the post key. 
$obj->post_raw('key'); // Provide unsanitized version of the post key. 

人們怎麼看待這種方法?是否有一個可以實現這一目標的「逃避所有」功能?

回答

2

你基本上是在談論重新實現magic_quotes_gpc。當Zend做到這一點時並沒有那麼順利。

最大的問題是1)不同形式的數據保護對於不同的環境是必要的,2)如果某個人是太多的noob來做基本的數據安全,他們肯定是10太多的noob瞭解您的自動防護機制已應用於哪些數據,以及哪些數據沒有。 (他們會從您的機制沒有的地方獲取數據,但無法觸及;請將此作爲給定的數據。)

+2

魔法行情是*不是一個全面的解決方案!實際上,它們意味着虛假的安全。 – Gumbo 2010-10-29 17:05:30

+0

確實如此。魔術引號可能是PHP中最大的失敗,這是很多的說法。 – chaos 2010-10-29 17:07:23

1

不,這是真的很難有一個通用的消毒功能。它總是使用特定的。而讓這樣我推薦別的東西:

http://sourceforge.net/p/php7framework/wiki/input/

它基本上覆蓋了超全局$ _GET,$ _ POST使用對象。這可以防止原始訪問,並且如果沒有使用適當的過濾器,您將得到通知或記錄錯誤。您仍然需要考慮使用哪個過濾器,但至少可以使用此方法來強制合作開發人員花費幾秒鐘的時間進行思考。此外它適用於:

$_GET->text["comment"] 

mysql_query("SELECT '{$_REQUEST->sql[field]}'"); 

$_POST->nocontrol->utf7->xss->text["text"]; 

也可以爲特定輸入變量名稱預先定義篩選器列表。或者使用$_POST->xss->nocontrol->always();來設置所有舊數組訪問的過濾器它需要一些習慣,但它確實是最簡單的API,僅適用於您描述的情況。

0

安全是一個非常複雜和微妙的主題恕我直言。

我不確定你是否應該允許對數據的不安全訪問。我只能訪問已清理的內容,並強制使用準備好的語句。