0

如何正确过滤掉 PHP 中的本地文件包含?我一直在寻找,但找不到一个简单的功能来做到这一点。据我了解,删除斜线是不够的。

4

2 回答 2

4

永远不要在用户输入上使用include()(或其亲属,like require()or )。readfile()曾经。

于 2012-04-23T18:31:45.733 回答
1

避免这种情况的最简单方法是不要编写include()来自用户输入的代码——通常不需要这样做。而不是让您的 URLfoo.php?page=bar仅用bar.php作 URL。

如果您绝对必须,您可以通过几种方式进行过滤。白名单很简单:

$ok = array('foo.php', 'bar.php', 'baz.php');
$include = in_array($_GET['page'], $ok) ? $_GET['page'] : 'default.php';
include($include);

这仅允许包含文件的预设列表。

或者,您可以使用正则表达式进行过滤(但这更容易出错):

if (preg_match('!^[a-z]+\.php$!', $_GET['page'])){
    include($_GET['page']);
}else{
    include('default.php');
}
于 2012-04-23T18:41:12.360 回答