正确滤除LFI

时间:2012-04-23 18:22:46

标签: php

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

2 个答案:

答案 0 :(得分:4)

请勿在用户输入上使用include()(或其亲属,如require()readfile())。如初。

答案 1 :(得分:1)

避免这种情况的最简单方法是不要从用户输入中编写include()的代码 - 通常不需要这样做。不要将您的网址设为foo.php?page=bar,而只需使用bar.php作为网址。

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

$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');
}