我正在寻找一种方法,我可以保护管理区域,特别是文件夹本身从外部访问(这些包括文件夹与图像和css)。我读过很多建议,但他们都觉得这是一种妥协或变通,而不是一种万无一有的方法,或者我不明白哪种方法最安全,也不知道外部世界,我想成为唯一知道或访问它的人。希望有人能透露一些他们会用什么,当他们想要的区域完全从外部世界隐藏,同时仍然可以访问你。
我遇到的一些方法包括:
- 将文件夹移出根目录
- 使用Htaccess拒绝所有。(也意味着我不能登录,除非我应用一个静态IP地址,我没有)
- 我想到的另一种方法可能是使用会话变量来存储管理员,根据会话ID识别和授予访问权限。(这意味着所有其他css文件和图像文件夹都是可见的)。
- 在文件夹中添加索引页,我看到很多网站都这样做。
我目前有我的登录脚本重定向到我的管理区域,所以无论如何,整个文件夹识别它的我和授予访问和服务文件,如果登录admin php文件请求它?,如果不拒绝访问包括图像和CSS等?
想不出如何最好地保护这个区域?使用会话是识别管理员的安全方法吗?
确保内容不暴露于网络的最简单方法是将其放在目录结构中的站点文件夹上方。
例如,在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';
}
第一步确实是将希望防止公众访问的所有文件移到文档根目录之外。这样就没有办法通过你的web服务器直接访问文件了。
如果你想阻止访问所有资源(包括图像,脚本,样式表等),你可以实现一个"代理",负责服务文件(检查用户是否被授权)。
要做到这一点,最简单和最灵活的方法是在应用程序中使用单个入口点。使用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
以上是一个非常简单的例子。通常情况下,你可能想要呈现一个真正好看的页面,告诉用户他不允许访问你的东西/呈现登录页面。
现在要渲染受保护的资源,你可以这样做: <<p> 目录结构/strong>- 项目
- 公共(docroot)
- index . php
- index . php
- 其他受保护文件
index.php in docroot
<?php
require_once __DIR__ . '/../index.php';
index.php in project
<?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;
}
现在你将完全控制你为谁服务,为什么服务。
请注意,它是否安全完全取决于您的实现是什么样子的,但通常:
- 总是把你的非公共文件放在文档根目录之外
- 始终将用户输入清理/白名单
- 始终保护您的数据
一些通用但相关的读取:
- 在PHP中阻止目录遍历,但允许路径(与
$file = $_SERVER['REQUEST_URI'];
点非常相关) 如何在PHP中防止sql注入? - PHP密码的安全哈希和盐
是的,您应该将内容移出文档根目录。您可以尝试使用。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');