我正在学习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条件验证。
我担心这可能是一个安全问题,并担心我是否会受到这种攻击。我不知道为什么会这样。如果这是一个安全问题,我该如何解决?
答案 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文件。