2009-11-17 49 views
0

我有這樣的代碼在包括經由GET請求的其他文件的頁面:這個有效性檢查是否易受攻擊?

$page = strtolower($_GET['page']); 

if(!$page or !$allow[$page] or $page == 'home') { 
    header("Location: home.php"); 
} 

$allow哪裏是包含允許字符串將被包括有效的文件的列表的硬編碼陣列。我是否錯過了一些可以允許代碼注入的明顯的東西,或者這個檢查足夠好?

回答

3

只要register_globals不允許$允許被覆蓋,它不是脆弱的。

它會拋出聲明,雖然,我個人不會有不區分大小寫的,所以我不喜歡這樣寫道:

if (empty($_GET['page']) || empty($allow[$_GET['page']]) || ($_GET['page'] == 'home')) 
{ 
    // Technically a header location should be a complete URL - http://... 
    header("Location: home.php"); 
    exit(); 
} 
+0

register_globals已關閉,所以這不是問題,不區分大小寫僅適用於後面的include。我知道我可以添加更多的限制條件(只是一個ctype_alnum()也許),但這隻會是多餘的,我猜?我正在與一位主持人爭論,因爲我的腳本一直在說一些奇怪的東西被執行,但我真的不能再現任何可以注入惡意代碼的情況。 – 2009-11-17 12:13:17

+0

我不認爲這是讓事情被注入的那條線 – Greg 2009-11-17 12:27:35

2

似乎沒問題。只需在header()後添加一個exit()語句來確保即使header()失敗,腳本也會終止。

0

這將是足夠的

$allow = array('home', 'another_one', 'blah'); 
$page = isset($_GET['page']) ? $_GET['page'] : 'home'; 
if(in_array($page, $allow, true)) 
    include "$page.php"; 

我'不知道爲什麼你使用「標題」那裏

0

「夠好」是一個非常寬的畫筆。你可以擴大一點嗎?另外,如果你知道$ _GET ['page']應該被限制爲一小部分值(比如整數,或者只包含小寫字母的標識符等等),那麼使用正則表達式驗證數據是絕不會受傷的。

0

最好在$頁面上執行一個正則表達式,以確保它符合在進一步檢查之前可以傳遞的消毒標準,如果$頁面的內容不符合,則不會進一步處理。 ..

相關問題