2012-11-02 79 views
-1

我試圖找到在PHP中消毒請求的最佳方式。在PHP中消毒全局數組

從我讀過的內容中我瞭解到,GET變量只有在顯示時才應該進行消毒,而不是在「請求流」的開頭。發佈變量(不是來自數據庫)。

我在這裏可以看到幾個問題:

當然,我可以創建功能,消毒這些變量,並通過調用類似Class::post('name'),或Class::get('name')一切都將是安全的。但是如果將來使用我的代碼的人會忘記它,並使用臨時$_POST['name']而不是我的功能呢?我可以提供,還是應該在這裏提供一點安全性?

回答

0

當PHP讀取它們時,變量基本上被「消毒」了。意思是如果我提交

"; exec("some evil command"); $blah=" 

然後,就PHP而言,它不會是一個問題 - 您將獲得該字符串。

但是,將它從PHP傳遞到其他位置時,務必確保「別的東西」不會誤解字符串。所以,如果它進入MySQL數據庫,那麼你需要根據MySQL規則(或使用準備好的語句,這將爲你做這件事)逃避它。如果進入HTML,則需要將<編碼爲&lt;作爲最小值。如果它進入JavaScript,那麼你需要對其進行JSON編碼,等等。

0

你可以做這樣的事......不是萬無一失的,但它的工作原理..

foreach($_POST as $key => $val) 
{ 
    //do sanitization 
    $val = Class::sanitize($val); 

    $_POST[$key] = $val; 
} 

編輯:你會希望把這個作爲靠近頭,你可以得到。我通常把我的控制器放在控制器中,所以它自動地從__construct()執行。

0

將$ _POST數組替換爲一個像數組一樣進行緩衝的sanitizer對象。

2

從來沒有一種萬能的消毒方法。 「消毒」意味着你操縱一個值來符合某些特性。例如,您將某個應該是數字的內容投射到數字上。或者,您可以將<script>標籤脫離應有的HTML。什麼以及如何淨化取決於價值應該是什麼以及是否需要消毒。例如,爲白名單標籤清理HTML非常複雜。

因此,沒有魔術Class::sanitize它適合一切。任何人使用你的代碼需要認爲關於他們正在嘗試做什麼。如果他們只是盲目地使用$_POST值,他們已經失敗了,需要打開他們的編程器卡。

總是需要做的是根據上下文轉義。但是,由於這取決於上下文,所以只有在必要時纔會這樣做。你不要盲目逃避所有的$_POST值,因爲你不知道你在逃避。有關整個主題的更多背景信息,請參閱The Great Escapism (Or: What You Need To Know To Work With Text Within Text)