如何正确过滤掉 PHP 中的本地文件包含?我一直在寻找,但找不到一个简单的功能来做到这一点。据我了解,删除斜线是不够的。
问问题
1569 次
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 回答