2010-05-22 40 views
4

我們都知道所有用戶數據,GET/POST/Cookie等都需要驗證安全性。你什麼時候信任數據/變量

但是當你停下來,一旦它被轉換成局部變量?

if (isValidxxx($_GET['foo']) == false) { 
    throw InvalidArgumentException('Please enter a valid foo!'); 
} 

$foo = $_GET['foo']; 
fooProcessor($foo); 

function fooProcessor($foo) { 
    if (isValidxxx($foo) == false) { 
    throw Invalid...... 
    } 
//other stuff 
} 

對我來說,這就是在上面。 但是如果你從數據庫裝載價值是什麼?

我希望我意義:)

回答

2

關鍵的一點是,您的程序的外部(用戶)輸入不可信,需要在使用前進行驗證。該輸入是從Web表單,配置文件還是用戶可訪問的數據庫派生而來,無關緊要。您的代碼的用戶可以始終提供垃圾值,無論是惡意還是意外。但是一旦驗證發生,重新驗證值就沒有意義了 - 您必須相信自己的組件。

在您的代碼的唯一控制下的數據庫可以被認爲是您信任的系統的另一個組件。這種數據庫中的值不需要驗證,除非您有理由相信它們可能因外部環境而變得不穩定。例如,您可能需要驗證通過網絡傳輸的值。

1

你這個得太多。

驗證所有需要驗證的內容(即所有用戶輸入),一旦在代碼路徑中,在足夠晚的時間點,在同一服務器會話中用戶不能改變的地方。

什麼時候無所謂。只要保持一致,並做任何你需要做的事情來保持你的代碼的可讀性和可維護性。

+0

「什麼時候沒有問題」,只要數據不會在你做這件事後發生變異...... – 2010-05-22 18:59:01

+0

「你正在推翻這件事。」事實上,我是...... – Wizzard 2010-05-23 03:03:51

+0

@格拉漢姆李:這是一個好點,我應該說得更清楚。 – 2010-05-23 15:04:22

0

超級全局變量,如$ _GET,$ _POST,$ _COOKIE或$ _SERVER 不可以在腳本中被用戶修改。一旦你的腳本加載它就是了。所以你只需要在他們進入時驗證一次。不止一次這樣做沒有任何意義,並浪費CPU時間。

0

要回答你的問題$ _GET和$ _POST應該永遠不可信。但是,在使用該變量之前,它不是一個漏洞。如果你打印出來print($_GET[xss])那麼你有一個xss漏洞。如果你插入這個變量到數據庫然後打印出來(如論壇帖子),那麼你有存儲xss這是更糟糕的。

你需要更好地理解攻擊者的心態。變量像$ _GET是污染源的來源,函數調用如print()mysql_query()接收器。黑客正在尋找可以影響受污染變量的匯。在php中有很多接收器,我推薦閱讀this black paper(或者紅紙,不管它的確定性不是白色的......)。請務必閱讀有關語言與程序員的部分。

相關問題