2011-08-10 46 views
1

雖然用戶輸入消毒/驗證是一個老生常談的話題,但我在特定情況下發布了一個說明。

的一段代碼包含

$haystack=$_GET['user']; 

$輸入從不用於「迴響」或「打印」或以任何SQL查詢或任何這樣的事情。用戶輸入($ haystack)的唯一用途是檢查字符串是否包含預定義的$針。

if (preg_match($needle,$haystack)) { 
$result="A"; 
} else { 
$result="B"; 
} 

我的擔心是惡意代碼的執行,而不是它在用戶輸入中的存在。

所以問題是,如果用戶輸入僅用於上面提到的上下文(在回聲,打印,SQL等沒有用處),是否仍然有可能在用戶輸入執行惡意代碼。

我想添加上下文所需的安全措施,而不是過度使用它。

+0

我認爲沒有問題,但是最大的問題是如果你忘記了哪個變量被消毒了。或者如果其他程序員認爲它已經過消毒。我知道這是一種很好的工作方式(忘記沒有檢查,但可能發生),更好地做一個功能來消毒,你可以很容易地將其應用於任何輸入。或者把你的清理過的變量放在明確標記的變量名稱中,例如$ clean_xxx –

+0

可能重複[在PHP中直接使用超級全局變量是好還是壞?](http://stackoverflow.com/questions/3498207/is-using-superglobals-directly -good-or-bad-in-php) – vaxquis

回答

0

它不可能通過修改字符串來執行任意代碼。只有當你直接輸出字符串,或者在SQL中使用它時,你纔會很擔心。

+2

除非模式依賴它:)離題,抱歉,但preg_match中的/ e修飾符可以執行代碼。 – Pelshoff

3

如果僅用於上下文中,則無法從用戶輸入中執行惡意代碼。

你應該小心evalpreg_replace(含改性劑e,感謝Pelshoff),數據庫查詢和echo(& printsprintf ...)。

0

preg_match不會最終執行您的輸入。隱藏可利用的漏洞太簡單直接了。如果您在運行preg_match之後折騰$haystack,那麼它不會傷害到您。

0

雖然$haystack可能不會被反映,但它可能會明顯影響程序流程。您發佈的(非常短的)代碼當然看起來並不直接易受攻擊,但不會消毒您的輸入可能會導致代碼與其他漏洞一起執行。