2009-06-11 30 views
1

在MVC的處事方式中,哪裏是最佳的運行場所,例如htmlspecialchars()上的任何輸入?它應該發生在視圖中(這是有道理的這樣做,因爲我應該處理整個控制器和模型的原始輸入?)對網頁上輸出的用戶輸入進行消毒的最佳位置在哪裏?

我不太確定...有什麼好處在視圖或控制器中執行它?這只是調整輸出到一個頁面......以儘量減少潛在的XSS漏洞。

+1

請停止稱之爲「衛生」或「過濾」。數據不髒或不乾淨;這是它的使用環境,這是有所作爲的。另請參閱我的答案在這裏:http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php/130323#130323 – troelskn 2009-06-11 10:39:29

+4

很多人都提到它作爲對數據進行清理......如果數據中有漏洞,則數據可能被認爲是骯髒的。即一些允許插入XSS的unicode hack。 – alex 2009-06-11 11:51:22

+0

不,認爲數據「髒」或「乾淨」是錯誤的。它不是數據的屬性 - 它是使用它的上下文,這使它變得危險或不危險。 – troelskn 2009-06-11 20:11:21

回答

6

那麼,這取決於,不是嗎?您應該清理視圖中輸出的所有內容。首先,因爲消毒取決於輸出的格式。 JSON淨化輸出與HTML淨化輸出不同,對嗎?其次,因爲你永遠不想信任你擁有的數據。它可能通過許多方式受到了損害。

雖然這不會防止SQL注入等。現在,您從不想在客戶端JavaScript中這樣做,因爲攻擊者可能很容易替換它。同樣,我的建議是在使用時進行消毒。如果您只是寫入文件,可能不需要。而且一些數據庫訪問庫也不需要它。其他人做。

無論如何,在使用的時候這樣做,所有的源代碼對於攻擊和錯誤(或者通過錯誤發起的攻擊)變得更加可靠。

0

您可以在視圖中執行此操作(通過javascript驗證),但是從渲染視圖到控制器的數據仍然被視爲不可信,因此您仍然必須在控制器中對其進行清理。

在我見過的例子中(例如nerddinner),清理代碼是模型類的一部分。有些人使用validation libraries

0

我沒有任何'最好'的地方來消毒。根據使用情況,我們可能需要在多個層級中實施消毒邏輯。

0

一般規律是:胖模型,瘦控制器。

現在,你如何運用該規則是一個不同的故事:)

我認爲它的方式是你的控制器應真的只是來控制流量,重定向到網頁等任何驗證應該在你的模型。如果你想做客戶端驗證,你可能會把它放在視圖中。任何擔心安全的開發人員都會在客戶端和服務器上進行驗證。

2

這就是爲什麼在設計模式中思考很糟糕。你應該問的是哪裏是最有效的這樣做?如果數據是一次寫入/多次讀取的,那麼每次數據輸出時(頁面視圖中)清理數據會對服務器造成不必要的負載。根據數據的使用方式,您可以在哪裏設置緩存,如何進行搜索等等來做出決定。而不是基於模式的優點。

從你說過的話,我會在寫入數據庫之前執行衛生。然後,您不僅要確保數據安全地插入,還要確保未來的錯誤不會導致發送未經處理的數據。如果您因爲某種原因想要原始文本,則只需反轉原始轉換即可。

由於所有文本都以一種或另一種形式編碼,因此您不應該擔心將數據存儲在數據庫中。如果您需要搜索文本,則只需編碼搜索字符串。如果你需要另一種格式,那麼這是另一個故事,但你必須根據你的需求來評估你的選擇。

1

我認爲最好的辦法是轉義視圖 - 輸出,並將所有東西都存儲在數據庫中。

爲什麼?使用這種方法,您可以爲每個用例使用db記錄。

0

我把它放在「控制器」中,因爲今天大多數框架都定義了它。 (沒有深入討論這是多麼純粹)它不是直接屬於視圖模板的東西,但它也不一定需要在模型中,因爲有時可能需要原始數據而不需要其他數據。

所以當我從控制器中的模型加載數據並將其分配給視圖(smarty模板,在我的情況下),我首先運行它通過HTML Purifier

0

我要在這裏逆勢應答趨勢,並給這樣的建議:

不可信的輸入應儘可能剛性地限制 - 通過減少你的輸入交互名額其安全性進行了評估之前當有人正在考慮錯誤修復或功能改進而不是安全性時,可以減少威脅風險,從而改變正在討論的系統。

0

取決於用戶輸入的類型以及它在其上運行的驗證。

如果你想清理輸入,當你輸出來自數據庫(或任何真正的源)的數據時,我會把邏輯放在控制器中,而也是

如果您正在進行數據驗證,我會在客戶端使用javascript以及模型進行數據驗證。