2011-05-05 47 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