2011-05-05 48 views
1

這段代碼有一些安全問題嗎?是一個查詢字符串的正確方法?php中的查詢字符串

我通常不會使用這種類型的代碼,所以我的問題。

<?php 
    $id = $_REQUEST['id']; 
    ?> 
    <? 
    switch($id) { 

     case "principal": 
      $pagina = "pag.php"; 
      break; 
     case "perfil": 
      $pagina = "secure.php"; 
      break; 

     default: 
      $pagina = "home.php"; 
      break; 
    } 
    ?> 

    <? 
    if((isset($pagina)) and (file_exists($pagina))) { 
     include($pagina); 
    } else { 
     echo "Page error"; 
    } 
    ?> 
+1

'require_once'是更好的做法,而不是'include',並嘗試使用'intval'如果有可能(在你的IDS) – mrzmyr 2011-05-05 14:42:06

+0

@M。 Myer,感謝 – anvd 2011-05-05 14:45:30

+2

不同意'require_once',它需要比需求更長的時間,如果你的應用程序組織正確,你不需要它。 – Galen 2011-05-05 15:02:18

回答

1

如果你的select語句得到大我推薦使用數組:

// array of pages 
$paginas = array(
    'principal' => 'pag.php', 
    'perfil' => 'secure.php' 
); 

$id = (int)$_GET['id']; 

if (isset($paginas[$id]) && file_exists($paginas[$id])) { 
    require($paginas[$id]); 
} 
else { 
    require('home.php'); 
} 
0

您有涉及$ ID,因此它應該是安全的每一種情況的處理程序。您也不需要這樣做,因爲$ pagina將始終設置爲:(isset($pagina))

1

唯一可能的問題是,如果您從$ _REQUEST獲取ID,某人可以通過將?id = x放入網址字符串。這可能無關緊要(很難說,因爲我們不知道發生了什麼事情的全部背景),但這是一種可能性。通過$ _POST將變量發送到頁面,這對用戶是隱藏的,可以使它變得更加安全。

0

我想添加一些htmlspecialchars。你永遠不會知道人們可以嘗試做什麼!

如果你想成爲「doubley」,那麼你總是可以這樣做;

filter_var($val, FILTER_SANITIZE_STRING); 
+0

爲什麼要添加htmlspecialchars?在正在做的事情的背景下沒有任何意義。 – 2011-05-05 14:42:38

+0

這是真的,並且越來越熱衷於這一切。不過,'filter_var'總是很好。 – James 2011-05-05 14:47:19

+0

你熟悉KISS原則嗎? :) – 2011-05-05 14:55:45

1

入侵者可以通過輸入yourpage.php猜測從secure.php和訪問它的ID?ID = PERFIL在他的瀏覽器...

+0

如果頁面是私人的,我將使用會話 – anvd 2011-05-05 14:45:03