3

ADMIN スクリプトがあります。

admin/index.php

すべてのアクティビティは、このindex.phpファイルを通じて行われます。
ユーザーは、プログラムの機能にアクセスする前にログインしています。
$_SESSION['user_authenticated']が作成され、trueに設定されます。

admin/template/..

このフォルダには、、、ファイルが含まれていimagesます。これらは、この ADMIN 内でのみ使用されます。(バックエンドのみ)cssjavascript


質問:

ディレクトリのすべてのコンテンツを直接アクセスadmin/template/..から保護する必要があります。認証されたユーザーのみが利用できるようにする必要があります。

.htaccessへのリクエストのリダイレクトが必要だと思います.trueまたはfalsecheck_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);
            }
        }

これが行うことはcall_user_func()、名前空間の汚染を停止include()し、PHP を実行chdir()し、スクリプトが適切な現在の作業ディレクトリを取得することを確認するために php を実行することです。

それは「簡単な」部分です。コンテンツ ヘッダーと MIME タイプは「推測」する必要があります (私は MIME タイプに finfo を使用しましたが、2013 年の時点でバグがあり、これは問題を悪化させるだけです)。Apache でも 100% 適切にそれを行うことはできません。 ...

次に、画像のキャッシュ制御ヘッダーを削除します。そうしないと、php ページと同じだけでなく...

言うだけで十分です。これを行う必要があるのは、パイプが太く、必要のない CPU サイクルが多い場合のみです...

于 2013-07-19T13:35:42.610 に答える