2013-08-17 38 views
2

在設置頁面上,我讓用戶編輯一些帳戶信息,如電子郵件,姓名,密碼等。出於偏執,他們可能會想出一種方法來偷偷追加$ _post數據來改變他們的角色或污染他們的文檔,不必要的添加字段,我使用$ _post數據上的array_interest_keys來對付允許字段的白名單。白名單字段名稱可防止惡意數據操作?

protected $user_settings_fields = array(
    'email' => '', 
    'password' => '', 
    'name' => '', 
); 

public function edit_settings(array $data) 
{ 
    $data = array_intersect_key($data, $this->user_settings_fields); 

    // Do stuff like check $data['_id'] against auth_user['_id'] 
    // to make make sure the user is updating their own document. 

    // Perform update 
} 

這是好的,常見的做法還是矯枉過正?即使有一位好友告訴我在使用MongoDB時沒有必要,我已經採取了其他預防措施,如轉換表單輸出數據。

回答

1

從數據庫安全角度來看,您可能可以將用戶提交的數據轉儲到MongoDB中,而無需從其POST數據中提取特定字段。但是,僅僅因爲MongoDB不易受大多數在其他數據庫上工作的注入攻擊的影響,而不是意味着插入提交的數據而不驗證是一個好主意。驗證所有字段是很好的常用做法,原因有幾個。

首先,正如你在你的問題中暗示的那樣,不「白名單」某些字段將允許惡意用戶一次插入大量數據到mongo中。 mongo集合中的最大文檔大小爲16MB。如果不採取措施,攻擊者可以用16MB的插入快速填充硬盤(每個GB的磁盤空間只需要大約64個帳戶)。其次,您應該仍然在逃避/驗證所有輸入爲最佳實踐,尤其是在列入白名單的字段中。除了明顯的驗證之外,例如確保他們已經提交了有效的電子郵件/用戶名,您應該在用戶提交的數據網站上使用ALWAYS。因爲您使用的是MongoDB,所以您不必擔心轉義以防止數據庫注入攻擊,即except in certain uncommon instances。但是,您的非轉義數據可能會用於執行跨站點腳本攻擊,允許用戶注入惡意JavaScript代碼,最多隻會將惱人的行爲插入到您的網站中,並且最糟糕的情況是會竊取人員的密碼。

您可以瞭解更多關於此這裏:http://en.wikipedia.org/wiki/Cross-site_scripting

而且那種逃避,你需要在這裏做的:How to prevent XSS with HTML/PHP?