在包含文件之前修剪$ _GET变量的最安全方法

时间:2012-10-24 06:54:55

标签: php include

我正在使用:

<?php

$file = $_GET['page']; //ie: http://localhost/?page=index
include "php/{$file}.php";

?>

但是我需要知道在调用$file时调整include变量最安全的方法是什么。

我在考虑类似的事情:

//-replace '.' with ''
//-replace '/' with ''
//-replace '\' with ''

但我确信有更好的方法,所以我请求你的帮助。 我需要它非常安全。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果您需要非常安全,即使在修剪后也不要包含它。相反,在您获得的变量和您需要包含的文件之间使用类似于类似的关联:

<?php
$file = $_GET['page'];

$allowed_pages = array('index', 'profile', 'legal', 'about');

if (in_array($file, $allowed_pages)) {
    include "php/" . $file . ".php");
} else {
    die("The page " . $file ." does not exist");
}
?>

这样,您永远不会获得任何意外的包含。

答案 1 :(得分:1)

我想无论你做什么,都不能信任用户数据。

如果你的可用文件数量有限,你应该制作一组数据并允许它们。

$allowedFiles = array('index','somewhere','elswhere');

if (!in_array($file,$allowedFile))
    exit ('File Not found');
else
    include("php/{$file}.php");

编辑:

另一种方法是扫描您的目录并删除您不想要的文件和目录。

$filesInDir = scandir("./php");
$allowedFiles = array_diff(array(".","..","protected.php"),$filesInDir);

if (!in_array($file.".php",$allowedFile))
    exit ('File Not found');
else
    include("php/{$file}.php");