2010-08-14 88 views
2

我準備在$ _GET數組的基礎上建立一個請求路由系統。包含文件時的安全考慮

例如,對於URL ?r=login我會使用包括myfiles/".$_GET['r'].".php"; 這將自動指向myfiles的/ login.php中

我知道我需要消毒獲取輸入,但我擔心,因爲它是可能會惡意重定向包含。任何人都可以建議如何防止這一點?在調用它之前,我還可以檢查實際存在的文件嗎?

我有我自己的一些想法,我只想知道我沒有錯過任何考慮。

+0

如果我設置包括與之前把絕對路徑變量,會阻止重定向站點? (我正在考慮將這些包含在Web根目錄之上,而不是公開的視圖)。 – YsoL8 2010-08-14 14:17:58

回答

5

不包含通過url指定的文件總是一個好主意。如果您仍然想這樣做,使用switch陳述或任何array過濾的東西,包括你只需要什麼:

例1:

$page = $_GET[...]; 

switch($page){ 
    case 'login': include 'login_page.php'; break; 
    // and so on 
    default: die("bye bad guy !"); 
} 

例2:

$page = $_GET[...]; 

$pages = array('page1.php', 'page2.php', 'page3.php'); 

if(in_array($page, $pages)) 
{ 
    include($page); 
{ 
else 
{ 
    die("bye bad guy !"); 
} 

我建議你看看這些相關的安全措施:

+0

有沒有更好的方法來在PHP中設置路由系統? – YsoL8 2010-08-14 15:04:09

+0

@ YsoL8:看看我的答案中的例子2。那是我能想到的那種你所處的狀況。 – Sarfraz 2010-08-14 15:14:37

+0

我希望自動設置路徑以保持結構的一致性。你會反對嗎? – YsoL8 2010-08-14 16:31:17

1

如果可以的話,使用白名單。如果不能,那麼:

  • 允許下劃線和字母數字字符只有
  • 把包含文件到一個單獨的目錄
相關問題