2009-01-19 22 views
23

即時通訊在Zend代碼上重新分解php,所有的代碼都是$_GET["this"]$_POST["that"]。我一直使用更多phpish $this->_request->getPost('this')$this->_request->getQuery('that')(這與getGet的getquery替代方法不太合邏輯)。使用Zend框架處理輸入(Post,get等)

所以我想知道我的方法是否更安全/更好/更容易維護。我在Zend Framework文檔中讀到,您必須驗證自己的輸入,因爲請求對象不會這樣做。

這使我有2個問題:

  • 什麼是最好的這兩個? (或者如果這是另一種更好的方法)
  • 什麼是使用這種方法驗證php輸入的最佳實踐?

謝謝!

回答

34

我通常使用$ this - > _ request-> getParams();檢索帖子或網址參數。然後我使用Zend_Filter_Input進行驗證和過濾。 getParams()不會進行驗證。

使用Zend_Filter_Input,您可以使用Zend Validators進行應用程序級驗證(或者您也可以自己編寫)。例如,您可以確保「月」字段是一個數字:

$data = $this->_request->getParams(); 

$validators = array(
    'month' => 'Digits', 
); 

$input = new Zend_Filter_Input($filters, $validators, $data); 
+1

我同意並建議看看Zend Form,因爲您可以將過濾器和驗證程序附加到表單中,然後使用該表單對象驗證所有傳入輸入。永遠不要忘記它是一個表單對象 - 它也是一個過濾器/驗證器容器。 – 2010-10-13 04:53:06

6

你不能寫GET/POST數據的一個尺寸適合所有的驗證功能。在某些情況下,您需要一個字段爲整數,而在其他情況下則需要一個日期。這就是爲什麼zend框架中沒有輸入驗證的原因。

你將不得不在你需要的地方寫驗證碼。你當然可以寫一些幫助方法,但你不能指望getPost()爲你自己驗證一些東西...

它甚至不是getPost/getQuery的地方來驗證任何東西,它的工作是爲了讓你獲得你想要的數據,從那裏發生的事情不應該成爲它的擔憂。

+0

不知道爲什麼你會得票低。 – 2009-01-19 17:16:30

10

延長Brian的答案。

如您所述,您還可以查看$this->_request->getPost()$this->_request->getQuery()。如果你概括了getParams(),這就好比使用超全球性的$_REQUEST,我認爲在安全性方面這是不可接受的。

附加到Zend_Filter,你也可以使用簡單的PHP來施放所需的。

例如爲:

$id = (int) $this->_request->getQuery('id'); 

對於其他價值,它變得更加複雜,所以一定要如在您的數據庫查詢中引用(Zend_Db,請參閱引用標識符,$db->quoteIdentifier()),並在視圖中使用$this->escape($var);來轉義內容。

1

我一直使用的更phpish $this->_request->getPost('this')$this->_request->getQuery('that')(這一個是沒有這麼多getGet的getquery insteado邏輯)。

這兩個最好的是什麼?(或者如果這是另一種更好的方式)

只是在選擇getQuery()的快速解釋。措辭的選擇來自於它的數據類型,而不是它如何到達那裏。 GET和POST只是請求方法,攜帶各種信息,包括在POST請求的情況下,稱爲「發佈數據」的部分。一個GET請求沒有這樣的塊,它攜帶的任何變量數據都是url的查詢字符串的一部分(?之後的部分)。

因此,雖然getPost()從POST請求的發佈數據部分獲取數據,但是getQuery()從GET或POST請求(以及其他HTTP請求方法)的查詢字符串中檢索數據。

(請注意,GET請求不應該被用於任何可能產生的副作用,如改變一個DB行)

所以,在回答你的第一個問題,使用getPost()getQuery()方法,這種方法,你可以確定數據源在哪裏(如果你不在意,getParams()也可以工作,但可能包含額外的數據)。

用這種方法驗證php輸入的最佳做法是什麼?

驗證輸入的最佳位置是您首先使用的地方。也就是說,當你從getParams()getPost()getQuery()中提取。通過這種方式,您的數據在您需要的地方總是正確的,如果您將它傳遞出去,就知道這是安全的。請記住,如果您將它傳遞給另一個控制器(或控制器操作),則應該再次檢查它,以確保安全。你如何做到這一點取決於你的應用程序,但它仍然需要檢查。

1

沒有直接關係的話題,而是 以確保你在你的輸入得到一個號碼,一個也可以使用$ VAR + 0 (但如果是$ var是它一直是一個浮動的浮動) 你可以使用在大多數情況下, $ id = $ this - > _ request-> getQuery('id')+0;

2
$dataGet = $this->getRequest()->getParam('id',null); 
$valid = new Zend_Validate_Digits(); 

if(isset($dataGet) && $valid->isValid($dataGet)){ 
// do some... 
} else{ 
    // not set 
}