2011-11-20 89 views
0

在PHP中有可能根據PHP documentation有數組中$_GET$_POST$_COOKIE$_FILES$_REQUEST。問題是那些來自用戶,我可能會得到他們而不是字符串。例如,請考慮下面的代碼片段。

<?php 
if (isset($_GET['hello'])) { 
    echo 'Hello, ', htmlspecialchars($_GET['hello']), '.'; 
} 
else { 
    echo '<form action="?"><input name="hello"><input type="submit"></form>'; 
} 

看起來好嗎?那麼,只要你不工作,它的URL就能正常工作。問題是黑客可以嘗試製作$_GET['hello']數組。如果URL字符串看起來像?hello[]=something PHP將返回錯誤信息

Warning: htmlspecialchars() expects parameter 1 to be string, array given in FILE on line 3

OK,誰能夠在生產現場(另一件事是錯誤日誌......)HTML錯誤。但整數也是一個問題 - PHP是動態類型語言,因此它可以輕鬆接受像'2' + 2這樣的代碼。雖然是的,你可以使用(int)我有一些舊代碼不這樣做。如果字符串來自$_GET$_POST它可能也是數組。類似array('2') + 2會導致PHP的致命錯誤。

Fatal error: Unsupported operand types in FILE on line 3

現在這是不可接受的,因爲它會停止腳本。我不需要這些變量的數組,但他們煩我。有沒有簡單的代碼片段可以從這些特殊變量中刪除數組。如果我真的想要一個數組,我可以在運行代碼片段之前複製它。

+2

只需在使用前驗證它們。你可以像'is_array'那樣進行額外的檢查來檢查提供的變量是否是數組,逃避它們等。 –

+0

真相被告知,誰在乎?如果你正在驗證一個該死的價值,那麼發生的最多的事情就是你什麼都不做。 – cHao

+0

@glitchMr的傢伙,即時通訊聊天室中的一位,我被暫停,請通過live-pin.com上的聯繫人部分與我聯繫。謝謝:( – Luis

回答

1

我會檢查它是否是一個字符串,然後在字符串上下文中使用它。

$name = (isset($_GET['name']) && is_string($_GET['name'])) ? $_GET['name'] : 'Unknown!'; 

或者:

if(isset($_GET['name']) && is_string($_GET['name']) { 
    //do stuff 
} 

如果你想雖然刪除所有的數組:

foreach($_GET as $key => $val) { 
    if(is_array($val)) { 
     unset($_GET[$key]); 
    } 
} 

哎呀樣子蘇德赫已經打我的那部分,但已經有這類型.. 。:)

3

您可以使用is_array()來檢查這樣的事情。

if (is_array($_GET['hello']) // exit/error 

或只顯示形式再次

if (isset($_GET['hello']) && !is_array($_GET['hello']) { 

至於有人輸入類似array('2') + 2你不需要擔心太多。它已經是一個字符串,因此它不會以php腳本運行。但是,根據您的範圍,以最適合您的格式對信息進行編碼總是一個好主意。

在你的例子中,有人可能會將HTML代碼注入你的get變量,導致該網站看起來不同。簡單的功能,如strip_tagshtmlentities不會傷害。

+0

你忘了關閉一個括號在if的結尾。除此之外,很好的答案。 – EdoDodo

1

你能那麼做這樣的事情:

foreach($_POST as $key => $val) { 
    if(is_array($val)) { 
     unset($_POST[$key]); 
    } 
} 

希望它可以幫助在某種意義上。