2013-06-24 50 views
-1

昨天我問了一個關於如何將通過URL傳遞文件的問題,有人給我這個:如何允許只包括特定頁面

if (isset($_GET['file'])){ 
    include($_GET['file'].'.php'); 
} 

但答案的人告訴我這樣做這樣做可以避免黑客或類似的攻擊。問題是我不明白如何自己做。

他說我應該做這樣的事情:

$pages_array=('home','services','contact'). 

再檢查GET VAR:

if(!in_array($_GET['page'], $pages_array) { die(); } 

這是什麼呢,怎麼才能把它融入我的原碼以上?

+0

我的問題是如何修改第一個代碼,使其工作,以及在哪裏把這些$ page_array-s,我知道這是一個愚蠢的問題,但我真的不知道如何。 – Fourtm

回答

1

您的原始代碼是尋找在URL中的file參數,然後包括任何文件中傳遞。所以,如果有人進入你的PHP頁面,並增加了?file=something.txt的網址,你會包括something.txt在內容你的輸出。

這樣做的問題是,任何人都可以手動修改URL以嘗試包含他們想要的任何文件 - 讓他們在系統上看到應該是私人文件的文件。

的解決方案是允許的文件名列表,像這樣:

$pages = array('home', 'services', 'contact'); 

然後你包括文件之前,檢查它的文件名允許第一個。

$pages = array('home', 'services', 'contact'); 
if (isset($_GET['file'])){ 
    if (!in_array($_GET['file'], $pages_array)) { 
     exit('Not permitted to view this page'); 
    } 
    include($_GET['file'].'.php'); 
} 

我們使用PHP array定義允許訪問的網頁列表,檢查,如果我們的頁面是與in_array()功能的列表,然後停止所有腳本執行,如果它不是在列表中有exit()功能。

0

你幾乎回答了你自己的問題...

除了這條線成爲...

$pages_array=array('home','services','contact'); 

而不是你有什麼...

$pages_array=('home','services','contact'). 
1

代碼檢查GET通過確保頁面名稱存在於您的$pages_array中,從瀏覽器傳遞到您的PHP頁面的信息。

只要您列出您的$pages_array中的所有頁面,代碼就會執行。如果頁面不在你的數組列表中,那麼它將會die而不被執行。

當使用GET時,驗證以這種方式發送的代碼總是有益的,因爲任意語句可以在未經驗證的情況下發送和執行。

在這種情況下,代碼正在驗證 - 所以你已經採取了必要的步驟;只要您沒有提交的代碼沒有其他內容。

正確的代碼

$pages_array=array('home','services','contact'); 
-1
$pages=array('home','services','contact'); 

if(isset($_GET['page'])) 

{ 


$page=$_GET['page']; 

if(!in_array($page,$pages)) 

{ 

die (''); 


} 

else { 

include($page.'.php'); 

} 
} 

所以,你的鏈接將是這樣的:

yoursite.com/index.php?page=home - >使用此工具:

http://www.generateit.net/mod-rewrite/

你可以更好URL」秒。

+0

爲什麼要投票?我向OP提出了這個解決方案,這就是爲什麼我回答,畢竟...我想解釋,謝謝。 – sinisake

0
//change the variable array declaration 
$newArray = array('home','services','contact'); 

只是做一個else語句中,如果像你

else { 
    //include your file 
    include($_GET['page'].'.php'); 
    } 
0

基本上,您的數組定義語法不對,但也是爲什麼die()如果$_GET['file']沒有設置?如果你恢復到默認狀態以便默默地失敗,會不會更好?

使用in_array()

<?php 
$pages_array = array('home','services','contact'); 

if(isset($_GET['file']) && in_array($_GET['file'], $pages_array)){ 
    include($_GET['file'].'.php'); 
}else{ 
    include('home.php'); 
} 
?> 

甚至使用switch()硬編碼值。

<?php 
$page = isset($_GET['file']) ? $_GET['file'] : 'home'; 
switch($page){ 
    case "home"  : include($page.'.php'); break; 
    case "services" : include($page.'.php'); break; 
    case "contact" : include($page.'.php'); break; 

    default: 
     include('home.php'); 
     break; 
} 
?>