这段代码有一些安全问题?制作查询字符串的正确方法是什么?
我通常不会使用这种类型的代码,所以我的问题。
<?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";
}
?>
答案 0 :(得分:1)
唯一可能的问题是,如果您从$ _REQUEST获取ID,有人可以通过在URL字符串中放入?id = x来更改您的查询。在你的情况下可能无关紧要(很难说因为我们不知道发生了什么的完整背景),但这是可能的。您可以通过向用户隐藏的$ _POST将变量发送到页面来使其更加安全。
答案 1 :(得分:1)
入侵者可以从secure.php中猜出id并通过在他的浏览器中输入yourpage.php?id = perfil来访问它...
答案 2 :(得分: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');
}
答案 3 :(得分:0)
对于涉及$ id的每种情况,您都有一个处理程序,因此它应该是安全的。您也不需要这个,因为$ pagina将始终设置为:(isset($pagina))
答案 4 :(得分:0)
我会为此添加一些htmlspecialchars
。你永远不会知道人们可以尝试做什么!
如果你想确保“双重”,那么你可以随时做;
filter_var($val, FILTER_SANITIZE_STRING);