2012-01-12 60 views
0

如果我有這樣的指標:查詢字符串動態內容

if (isset($_GET['se'])) { 
    $se= $_GET['se']; 

    if (file_exists("{$se}.php")){ 
     require("{$se}.php"); 
    } 
    else { 
     require("page_error.php"); 
    } 
} 
else { 
    require("page_error.php"); 
} 

類似下面的鏈接不起作用:

$pwrurl = "http://example.com/login/?se=change_password?usermail=".$email."&usercode=".$linkHash; 

只有這樣的:http://example.com/login/?se=change_password將被接受。

這能解決嗎?

+4

嘗試使用'&'作爲分隔符。你有兩個'?'這是不正確的。 – 2012-01-12 22:37:04

+0

你的意思是'動態'(而不是動態)? – 2012-01-12 22:37:54

回答

5

當心!

讓用戶決定在沒有任何驗證的情況下包含哪個文件會給您的服務器帶來一個漏洞。他們可以將腳本指向任何敏感文件。

你應該限制可包括哪些準備,就像這樣:

$allowed_files = array(
    "page_error", 
    "some_section", 
    "some_other_section", 
    "change_password" 
    ); 

$se = empty($_GET['se']) ? "page_error" : $_GET['se'] ; // "page_error" by default. 

if (in_array($se, $allowed_files)){ 
    require("{$se}.php"); 
} else { 
    require("page_error.php"); 
} 

這樣,他們只能讀取你把數組中的文件。

編輯:另外,就像其他人說的一樣,你應該在URL中分開不同的參數=參數對,而不是使用&。這個?用於從參數列表中分離頁面名稱。

http://example.com/login/?se=change_password&usermail=... 
+0

好的謝謝。我也將使用FILTER_VALIDATE_URL – 2012-01-12 22:55:40

+0

使用該過濾器,但不要僅依賴於該過濾器,因爲它不會保護您免受我提到的漏洞攻擊。 – 2012-01-13 01:05:03

3

您在URL中有兩個?。多個參數必須用&分開。

您使用require非常危險。閱讀安全。在將其傳遞給這樣一個危險函數之前驗證任何參數,否則您的網站將很快被黑客入侵。

2

該鏈接是錯誤的,應該是'&'而不是'?'在change_password之後。

$pwrurl = "http://example.com/login/?se=change_password&usermail=".$email."&usercode=".$linkHash;