访问根目录之外的php文件最安全的方法是什么?

时间:2012-07-07 10:31:53

标签: php security include

我试图在stackoverflow和网络上的其他地方搜索其他地方。

似乎无法牢牢锁定一个表明这是最安全的答案。

我知道最安全的方法是,在可能的情况下,不要在根目录中包含任何可以帮助它的php文件。

所以,我想要找到的是,如果我想在一个目录中包含一个存储在根目录外的php文件,比如说,在另一个目录中,对我来说最安全的方法是什么?

2 个答案:

答案 0 :(得分:1)

这不会直接回答您的问题,但可能会让您以不同的方式查看您的应用结构。我认为从webroot外部包含文件是不安全,这是一种误解。

相反,许多人都有一种结构,即大多数所有的应用程序逻辑都在public_html或类似目录之外。特别是对于全能路由器类型系统。

您可以拥有如下结构:

var
    www
        public
            something.js
            happy.jpg
            index.php
        application
            bootstrap.php
            AwesomeClass.php
            Router.php

现在,使用您的index.php,您可以制定应用的真实根。

类似的东西:

define('WEB_ROOT', __DIR__);
define('APP_ROOT', dirname(__DIR__));
define('PHP_ROOT', APP_ROOT . DIRECTORY_SEPARATOR . 'application');

现在,您拥有指向公共html目录的真实文件系统路径以及php文件所在的常量,现在可以安全地包含以下文件:

include(PHP_ROOT . DIRECTORY_SEPARATOR . 'bootstrap.php');

这是非常安全的,很多人都有像这样结构的应用程序。如果您没有任何.htaccess或类似的伏都教,它还会阻止人们浏览您所存在的任何php文件。

答案 1 :(得分:0)

从您的问题来看,我认为您希望阻止目录传输(人们试图让您的脚本包含/ etc / passwd等)。

在请求的路径上使用realpath。这应该扩展所有../..等。

完成此操作后,您会检查realpath()针对白名单返回的结果,或将其限制在您自己的目录中,并检查file_exist()file_exist('myfolder' . DIRECTORY_SEPERATOR . $resultFromRealPath())