2013-08-02 43 views
4

我想知道是否有可能得到一個變量,無論是在POST或GET,然後使用filter_input()來消毒它。如何在使用filter_input的同時檢查POST和GET數據?

起初我以爲$var = filter_input(INPUT_POST | INPUT_GET, "var", FILTER_SANITIZE_STRING)可能工作,但它並沒有和PHP手冊說明你只能通過一種類型的輸入。

我也試過INPUT_REQUEST,奇怪的是沒有工作。該函數可以識別它(即不會拋出錯誤,說我在$ input中輸入了錯誤),但它不會得到任何代碼。是的,我知道不要在現場環境中使用INPUT_REQUEST,我只是純粹測試它是否可行。

目前我做到以下幾點:

$var = filter_input(INPUT_POST, "var", FILTER_SANITIZE_STRING); 
if(!$var) $var = filter_input(INPUT_GET, "var", FILTER_SANITIZE_STRING); 

但是在PHP中很多事情,往往有更簡單的方式,將做這一切對我來說在一個命令。我想知道這是否是這種情況,我可以將它們組合成一張支票嗎?我在谷歌上進行了粗略的搜索,甚至找不到任何人蔘考這個嘗試,更不用說一個解決方案,所以現在我轉向你很好的人。

+0

爲了什麼目的,你想「消毒」你的字符串? –

+0

爲了確保在GET變量中沒有輸入任何惡意代碼,或者在POST的情況下,某人沒有篡改表單(它很可能是一個隱藏變量)並在其中放置了惡意代碼。 – Styphon

+0

http://php.net/manual/en/function.filter-input.php - 正如所說的,第一個參數是常量之一,沒有數組,沒有||條款。如果你想用一行來完成,你必須建立一個接受數組的用戶函數,然後將所有元素設置爲第一個參數。然而,這似乎是不好的做法,因爲你不知道你的輸入是什麼。 –

回答

3

如果您不知道您的輸入是否在GETPOST中,則認爲這是不好的做法。你應該總是知道而不是隨意接受。

+0

大部分我都會同意這一點,而且我通常會堅持到一個或另一個。儘管我將數據發佈到表單的某個頁面上,但我也偶爾會遇到這種情況,但也像用戶能夠使用可用變量保存鏈接一樣,可以更輕鬆地使用POST和GET類型。 – Styphon

+0

所以你說 - 「我知道我的用例不好,但我仍然希望它得到支持」。 – Halcyon

+5

一點也不,我認爲在大多數情況下這是不好的做法,儘管如此,與大多數情況一樣,規則也有例外。 – Styphon

0

從我讀的你可以改變你的形式POSTGET - 這樣你只需要接受GET - 不知道我是否理解正確的方式。

1

我覺得沒有比讓一個自定義的函數,你已經提到的代碼更好的方法:

function getPostOrGet($name) { 

    $var = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING); 

    if(!$var) $var = filter_input(INPUT_GET, $name, FILTER_SANITIZE_STRING); 

    return $var; 

} 

如果你認爲這是正常的,你不能使用|操作,因爲這樣如果在兩者中都定義了它會發生什麼。

另請注意,由於這是一種不好的做法,因此沒有「簡單」的方法。因此,如果您真的需要使用自定義函數,並且只使用正確的輸入類型。

0

如果消毒正確你的輸入,我會親自測試filtre_input結果爲null,因爲if(!$var)條件可以通過像0一個falsy但現有的值被觸發。

例如:

function getLatitude($name) { 
    $var = filter_input(INPUT_POST, 'latitude', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 
    if($var === null){ 
     $var = filter_input(INPUT_GET, 'latitude', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 
    } 
    return $var; 
} 

與往常!$var條件和FILTER_SANITIZE_NUMBER_FLOAT,你會得到一個null值,而不是0

相關問題