如何保护管理员文件夹php

时间:2014-07-07 18:54:10

标签: php css security

我希望找到一种方法来保护管理区域,特别是外部访问的文件夹本身(包括带有图像和css的文件夹)。我已经阅读了很多建议,但他们都觉得相当妥协或解决方法而不是防弹方法,或者我不理解哪种方法最适合安全并且隐藏在外面的世界,我想成为唯一了解它的人或者访问它。希望有人可以在他们希望这个区域完全隐藏在外面世界的同时可以使用它们时可以使用它们。

我遇到的一些方法涉及:

  1. 在根目录外移动文件夹
  2. 使用Htaccess拒绝所有。 (也意味着我无法登录,除非我应用我没有的静态IP地址)
  3. 我想到的另一种方法是使用会话变量来存储管理员,根据会话ID识别和授予访问权限。 (这确实意味着所有其他css文件和图像文件夹都是可见的。)
  4. 在我看到很多网站的文件夹中添加索引页面。
  5. 我目前有我的登录脚本将我重定向到我的管理区域,所以是否有整个文件夹识别它是我并授予访问权限并提供文件,如果登录的管理员php文件请求它?,如果没有拒绝访问包括图像和CSS等?

    无法弄清楚如何最好地保护这个区域?使用会话是一种识别管理员的安全方式吗?

3 个答案:

答案 0 :(得分:2)

确保内容不会暴露给网络的最简单方法是将其放在目录结构中的网站文件夹上方。

所以例如在你的Apache配置中安装网站

/var/www/sites/site/content/

并将受限制的内容放在

/var/www/sites/site/

这样就不会暴露内容,但如果需要,php仍然可以阅读。

显然,这不会阻止用户看到你的css文件中的内容,如果php读取它们并回应它们但我不明白为什么css文件应该是安全的

修改

假设您的服务器上有/var/www/sites/site/content/some_folder

的文件夹

然后您在浏览器中输入www.yoursite.com/some_folder,假设您的网站中已打开索引,您将在some_folder

中看到文件列表

但是如何从网络浏览者那里获得/var/www/sites/site/? ......你不能!!

但你可以做的是这样的事情:

这将是主站点文件夹中的一个php文件(公开可见)

<?php

session_start();
if(isset($_SESSION['admin_logged_in'])){
   include '/var/www/sites/site/secret_content.php';
}

答案 1 :(得分:1)

第一步确实是将您想要阻止公共访问的所有文件移到文档根目录之外。这样就无法直接通过您的网络服务器访问文件。

如果您希望阻止访问所有资源(包括图像,脚本,样式表等),您可以实现&#34;代理&#34;负责提供文件(在检查用户是否被授权之后)。

最简单,最灵活的方法是在应用程序中使用单个入口点。使用apache可以使用以下重写规则轻松实现:

RewriteEngine On
RewriteRule ^(.*)$ index.php [L,QSA]

这将确保每个请求都将通过index.php文件。

不,您可以轻松检查是否允许您使用例如:

访问资源
<?php

session_start();

if (!isset($_SESSION['user'])) {
    header('HTTP/1.0 403 Forbidden');
    exit; // important to prevent further execution of the script
}

// user is allowed access, do shit

以上是一个非常简单的例子。通常情况下,您可能希望呈现一个看起来很漂亮的页面,告诉用户不允许他访问您的内容/呈现登录页面。

现在要渲染受保护的资源,您可以执行以下操作:

目录结构

  • 项目
    • public(docroot)
    • 的index.php
    • 的index.php
    • 其他受保护的文件
docroot中的

index.php

<?php

require_once __DIR__ . '/../index.php';

项目中的index.php

<?php

session_start();

if (!isset($_SESSION['user'])) {
    header('HTTP/1.0 403 Forbidden');
    exit; // important to prevent further execution of the script
}

$file = $_SERVER['REQUEST_URI']; // important to sanitize or possible check against whitelist the requested resource

$ext = pathinfo($path, PATHINFO_EXTENSION);

switch ($ext) {
    case 'jpg':
    case 'jpeg':
        header('Content-type: image/jpeg');
        imagejpeg('/path/to/protected/resources/' . $file);
        break;
}

现在,你将完全控制你所服务的对象和对象。

请注意,它是否安全完全取决于您的实施情况,但一般来说:

  • 始终将非公开文件放在文档根目录之外
  • 始终清理/白名单用户输入
  • 始终保护您的数据

一些通用但相关的读物:

答案 2 :(得分:0)

是的,您应该将内容移出文档根目录。您可以尝试使用.htaccess来保护您的文件,但允许.htaccess覆盖本身就是一个安全问题。这当然是一个性能问题。

只需将404处理程序指向类似......

<?php
define('REQUEST_PATH', '/secure');
define('SECURED_CONTENT', '/var/www/restricted');

$req=parse_url($_SERVER["REQUEST_URI"]);

if ((0===strpos($req['path'],REQUEST_PATH)) 
    && $_SESSION['authenticated']) {
       if (is_readable(SECURED_CONTENT . $req['path']) 
           && is_file(SECURED_CONTENT . $req['path'])) {
              header('Content-type: ' 
                 . mime_content_type(SECURED_CONTENT . $req['path']);
              include(SECURED_CONTENT . $req_path);
       } else {
             header('HTTP/1.0 404 Not Found');
       }
       exit;
} 
header('HTTP/1.0 403 Forbidden');