2013-04-06 53 views
0

我想弄清楚消毒的最佳方式,並在某種程度上驗證發送到我的應用的POST數據。在路由器中保護POST數據

我做了這個功能駐留在我的路由器,被稱爲在__constructor if($_POST)存在:

private function validatePost() 
    { 
    foreach($_POST as $key => $value) { 
     if(preg_match('/[^a-zA-Z]/', $key)) 
     { 
     $this->throwError('POST Error', 'Invalid index name.'); 
     return; 
     } 
     if(strlen($value) > $this->postLimit && $this->postLimit != -1) 
     { 
     $this->throwError('POST Error', 'Posted value to large.'); 
     return; 
     } 
     if(substr($key, -2, 2) == 'id' && !is_numeric($value)) 
     { 
     $this->throwError('POST Error', 'Expected a number, didn\'t get one.'); 
     return; 
     } 
     else 
     { 
     //$value = urlencode($value); 
     } 
     $_POST[$key] = $value; 
    } 
    } 

這是故意有點嚴格,但如果我堅持規則,沒關係我已經在我的框架中做出了。

我已閱讀,限制$ _ POST大小確實有助於挫敗一些攻擊,在這種情況下,我把-1代表/默認限制(但如果需要我的配置文件,它可以被設置爲以下)。

我註釋掉URL編碼,因爲我目前不能確定的,當它到達預定的功能將其解碼的最佳途徑。我應該編碼它,最好的解碼方法是什麼?也許在我所有的課程延伸與否的大師Controller中?

任何其他建議都歡迎。

回答

2

如果您想限制POST請求的大小,那麼最好的選擇是在web服務器本身的級別上執行。有這方面的工具。既然你最喜歡使用Apache,那麼你可以看看mod_security。其他網絡服務器也會有類似的選項。

當限制POST請求的大小時,其中一個風險是用於執行頁面的內存量。如果數據已經在$_POST那麼你太晚了。

至於驗證和環境衛生應該做到無論在domain objectspresentation entitiessql ......你驗證輸入的邏輯域對象。您在SQL約束中劃分數據結構。並且您在演示實體中清理輸出(我不鏈接稱它們爲「演示模型」,因爲它增加了對MVC的混淆)。在MVC中的路由機制(也就是前端控制器的一個方面)應該只是接受用戶的輸入並將其組織在一個結構化的Request實例中,然後這個實例被控制器的動作用來傳遞數據model layer

路由不應驗證輸入