2010-06-07 78 views
7

我正在做一個相當大的php應用程序的安全審計,並想知道我應該包括我的用戶輸入驗證。函數或調用者是否應該負責輸入驗證?

我應該驗證數據,然後將乾淨的數據發送到後端函數,還是應該依靠每個函數來進行自己的驗證?甚至兩個?

這種事情有沒有什麼標準或最佳做法?

目前,該應用程序不但不一致,而且我希望使事情更加一致。

+0

http://symcbean.blogspot.co.uk/2017/07/validate-input-escape-output.html – symcbean 2017-08-19 16:59:06

回答

6

您應該儘快驗證外部數據。根據體系結構,負責函數中的後端驗證可以是第二步,但不要依賴於後端驗證,而是在數據進入應用程序時驗證數據。

裏面的功能驗證,以補充先前驗證的優點是,它更容易(更安全),以維持系統,因爲當你(更模糊)的開發人員不能破壞應用程序。如果您的應用程序支持插件,例如對於第三方插件,安全功能也是必須的。

+0

這樣做的一個問題是,當應用程序何時它涉及到你的應用程序是你可能不知道如何使用變量。出於這個原因,它通常最好在使用之前立即進行消毒,這也使得基於安全的同行評審更容易**。 – rook 2010-06-07 20:49:51

2

我想如果你可以做到這一點,並且時間/資源不是問題,爲什麼不呢?

2

這取決於應用程序的範圍/定義。但傳統上,您的函數可能會在$ object-> doSomething()中使用。通過依靠在那裏的驗證,你可以防止自己做的某件事()的能力,你知道嗎?

太,如果你保持在你身邊驗證可以輕鬆地管理它。無需在特定的內部功能中追捕它。保持OOP,但更像

$ data = $ validator-> sanitizeSomething($ data); $ object-> doSomething($ data);

這可以讓您的驗證規則分開,並且易於管理以及您的內部功能。

爲了詳細說明,假設你有一個數據庫對象,增加了一個數組表:

class db { 
    function addRow($table, $associativeArray) { 
     // primitive i know, just an example 
    } 
} 

將要在那裏,你的驗證?

function addRow($table, $associativeArray) { 
    if(isset($assiciativeArray['description']) { 
     // validate 
    } 
} 

將是愚蠢的 - 你會想,在對象你

class product { 
    function update() { 
     if($this->validate()) { 
      $this->db->addRow($this->toArray()); // or something, you get the idea, ya? 
     } 
    } 
    function validate() { 
     if($this->description != "") { 
     return true; 
     } 
     return false; 
    } 
} 
8

無論是更好的答案正在努力。數據驗證應發生在每個將處理數據的函數中,以避免希望驅動開發(HDD

+0

我對此觀點非常同情!這是真正的做法。這是PHP變得頭疼的地方,因爲弱類型迫使你創建自己的檢查,以確保所有函數參數都是正確的類型=( – 2010-06-07 20:10:12

+0

但是必須有一個平衡點。如果我用一個只接受一個數組的函數,該類如果是一個特定的對象,那麼這個類就會執行一個特定的任務,所以如果我給它一個字符串並且期待一個數組,那就不是硬盤 - 這是我愚蠢的行爲。 :應用程序是否有很好的文檔記錄?是否有強大的公開可用的方法,可以優美地封裝功能? – 2010-06-07 20:14:38

2

驗證在後端就像在乘客登機後篩選乘客。驗證的重點是防止注入可能會窒息您的應用程序的元素。所以你必須在進入門之前驗證:)

+0

如果您不相信在門口放映的人員每次都要正確地做好自己的工作,那麼比較安全 - 在飛機起飛前檢查:p但肯定應該早點收到錯誤的輸入,而不是晚點,但要雙倍確定。 – Davy8 2010-06-07 20:23:31