可以加入Apache / PHP,根文件夹和外部文件夹的安全问题

时间:2016-04-15 04:20:15

标签: php apache .htaccess security

我正在学习PHP和Apache配置,我正在使用 XAMPP版本:5.6.19。我有一个名为default.php的页面,此页面将加载页眉,页脚和内容子页面在它们之间,此内容子页面将保存在名为“content”的文件夹中。因此,要加载显示内容子页面的网站,我会写:

本地主机/ misite /如default.php?页=子页面

这样做我已经按照以下方式编写了default.php:

RewriteEngine On
RewriteBase /misite/
RewriteRule ^([a-zA-Z0-9-]*)$ default.php?page=$1

我这样编码是为了只允许加载内容文件夹的php文件,最重要的是防止通过执行../技巧从那里访问到另一个文件夹,所以如果有人尝试,结果将是:< / p>

默认?page = .. /。php

这将产生重定向到索引页面。

当我尝试使用SEF URL具有相同功能时出现问题。我在.htaccess上编写了以下内容:

{{1}}

所以我可以写

本地主机/ misite /子页面

所以我期待相同的结果,因为参数$ 1现在是default.php上“page”参数的值,并且预计其他所有内容都是相同的,所以我没想到能够访问其他文件夹。但是,当我尝试以下内容时:

本地主机/../

结果我到了仪表板页面(localhost / dashboard /),这是一个位于mi site文件夹之外的页面,如果我尝试 localhost / .. img /我可以访问img文件夹等等。看起来它甚至没有执行我的default.php条件验证。

我担心这可能是一个安全问题,并担心我是否会受到这种攻击。我不知道为什么会这样。如果这是一个安全问题,我该如何解决?

1 个答案:

答案 0 :(得分:0)

安全风险在于这一行:

$page = 'content/'.$_GET['page'].'.php';

不检查,您允许任何输入搜索您的磁盘,然后调用glob。将评估相对路径,让用户引用服务器上的任何PHP文件。

如果所有PHP文件都在“内容”内而不在更深层目录中,那么一个解决方案就是

// Check "page" only contains letters, numbers, underscore
if (!preg_match('/^\w+$/', $_GET['page'])) {
    header("HTTP/1.0 404 Not Found");
    exit();
}
$page = 'content/'.$_GET['page'].'.php';

然后您可以确信$page中的路径仅引用内容目录中的PHP文件。