3

我有一个管理员脚本。

admin/index.php

所有活动都是通过这个index.php文件完成的。
用户在访问程序功能之前登录。
$_SESSION['user_authenticated']被创建并设置为true

admin/template/..

此文件夹包含images, css,javascript文件。
它们仅在此 ADMIN 中使用。(仅在后端)

问题:

admin/template/..我需要保护目录中的所有内容不被直接访问
它应该只对经过身份验证的用户可用。

我想必须有一个.htaccess重定向请求check_session_auth_variable.php,它看起来$_SESSION['user_authenticated']还是重定向到请求的文件抛出 404 错误

我知道最好的选择是将目录放在 Web 根目录之外,但在我的情况下,我需要保持目录结构不变,无需修改。

4

3 回答 3

3

管理员/.htaccess:

RewriteCond %{REQUEST_FILENAME} !check_auth.php
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* check_auth.php?file=$0 [QSA,L] # pass everything thru php

管理员/check_auth.php:

$file = $_GET['file'];
if($_SESSION['user_authenticated']) {
    // please mind you need to add extra security checks here (see comments below)
    readfile($file); // if it's php include it. you may need to extend this code
}else{
   // bad auth error
}
于 2013-01-20T02:22:23.460 回答
2

好的,这是我的答案——最好的答案是“不”。但是 images/js/css 在开发中相对重要(在上线之前公开),并且客户端预览表明我们不能执行基于 IP 的 apache 规则。所以,规则(从上面,稍微修改)是

RewriteEngine On

# Exclude the public and error directories from authentication
RewriteRule ^(public|error)($|/) - [L]

# Perform authentication via php
RewriteCond %{REQUEST_FILENAME} !auth.php
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* auth.php?requested_file=$0 [QSA,L]

(因为我需要一些内容确实公开的子目录,请阅读:登录页面上使用的 images/css/js)

相关的php如下;为了

        if($authenticated){
            if($extension == 'php'){    

                call_user_func(function(){

                    $file_name = func_get_arg(0);

                    $path = getcwd();
                    chdir(pathinfo($file_name,PATHINFO_DIRNAME));
                    return include($file_name);
                    chdir($path);

                }, $file_name);

            } else {

                //set cache headers so the browsers don't have to refresh all the
                // static content
                header_remove('X-Powered-By');
                header_remove('Transfer-Encoding');
                header_remove('Cache-Control');
                header_remove('Pragma');
                header_remove('Expires');
                //header('Expires:');

                header('Content-type: '.$mime_type);
                readfile($file_name);
            }
        }

它的作用是执行 php usingcall_user_func()以停止命名空间污染,include()执行 PHP,并chdir()确保脚本获得正确的当前工作目录。

那是“容易”的部分;内容标题和 mime 类型必须“猜测”(我使用 finfo 作为 mime 类型,但它在 2013 年有一个错误,这只会加剧问题)但即使是 apache 也不能 100% 正确地做到这一点...

然后删除图像的缓存控制标头,否则您不仅会经常成为 php 页面...

可以说;如果你有粗管道和很多你不需要的 CPU 周期,你只需要这样做......

于 2013-07-19T13:35:42.610 回答
0

我通常用这个

$redi_ext = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$php_verify = strpos($redi_ext, ".php");
if($php_verify !== false){ header('location: PAGE_NOT_FOUND_URL'); }
于 2017-11-13T18:33:43.773 回答