PHPセッションを使用してApacheのディレクトリを保護する方法


8

認証にPHPセッションを使用するサイトがあります。PHPを使用せずにアクセスを制限したいディレクトリが1つあります。それは静的コンテンツでいっぱいです。

すべてのリクエストがPHPスクリプトを通過せずにアクセスを制限する方法がわかりません。Apacheにセッション認証情報をチェックさせ、基本認証のようなアクセスを制限させる方法はありますか?

回答:


5

設定を変更しない限り、PHPセッションデータは、独自のserialize()形式のバリエーションで一時ディレクトリに保存されます。PHP自体を使用しないと、そのセッションを取得するのは簡単ではありません。

残念ながら、実際に互換性のある目標ではない、各リクエストを動的に承認しながら、静的に配信されるファイルの速度を求めているように見えます。あなたはmod_rewriteを使ってその中のファイルへのリクエストを書き換える超軽量のPHPスクリプトを作成することで妥協するかもしれません。超簡単な例:

.htaccess:

 RewriteEngine On
 RewriteMap auth prg:auth.php
 RewriteRule (.*) ${auth:$1}

auth.php:

#!/usr/bin/php
 <?PHP
 set_time_limit(0); # This program needs to run forever. 
 $stdin = fopen("php://stdin","r"); # Keeps reading from standard in
 while (true) {
        $line = trim(fgets($stdin));
        if (isset($_SESSION['USER_LOGGED_IN'])) {
                echo $line\n";
        } else {
                echo "authfailed.html\n";
        }
 }

特に、そのPHPスクリプトは永久に実行されるため、変更した場合はApacheを再起動する必要があると思います。

これはすべてテストされていませんが、大体はあなたが入らなければならないと私が思う方向です。

参照:


私はこのアプローチが好きですが、RewriteMapスクリプトがstdin以外のものにアクセスできるかどうか疑問に思っていますか?Cookieなどのコンテキストはありますか?
Cogsy、

実際、はい、あなたはポイントを持っています。mod_rewriteの環境変数構文を使用してCookieの値を送信できます(そのため、構文は$ {auth:$ 1 $ COOKIES}のようになると思います。この方法では、次の方法でstdinの行を引数で分割する必要があります。セッションの内容をピックアップしてください
Aquarion

一定の認証ID(ビット長のロット)でログインしてCookieを設定し、ディレクトリアクセスで確認した場合はどうなりますか?最善の解決策ではありませんが、管理ページでは機能します...(ユーザーがCookieを共有できるため、ファイル共有ページでは機能しません...)
inf3rno

1

期待できる特定のCookieがある場合は、mod_rewriteを使用してその不在をテストし、403 Forbiddenを指定できます。

RewriteCond %{HTTP_COOKIE} !LoggedIn=true
RewriteRule .* - [F,L]

しかし、「LoggedIn = true」が設定されたCookieが必要であることを誰かが知っていれば、簡単に「保護」を回避できます。

PHPセッションはPHPに固有です。Apacheには、PHPセッションで情報を使用する方法がありません。セッションの検証を行うための認証モジュールが必要です。

ほとんどの人が見ているのは、PHPスクリプトに静的コンテンツの処理を処理させ、リクエストを取得し、セッションを検証し、ファイルを読み取って、適切なMIME情報でコンテンツを送信することです。


または、ログイン、ログアウト、
GC

1

その問題の従来の解決策は、そのフォルダーのすべての呼び出しをphpファイルにリダイレクトすることです。これにより、ユーザーの権限がチェックされ、その後、ファイルが読み取られ、出力ストリームに送信されるか、ユーザーが「権限なし」にリダイレクトされます。地点。 例えば...

ファイルを保護するもう1つのトリッキーな方法は、session_idと静的ソルトからトークンを生成し(オプションで静的ファイルパスから)、ファイルアクセスによってそれをチェックすることです。そのため、htaccessファイルでそのトークンを再生成する必要があります。.htaccessでのみ可能かどうか、またはそのためにphpを使用する必要があるかどうかはわかりません。私はここで同様の解決策を見つけました。私は99%確信しています。md5は組み込みのmod書き換え機能ではないということです。


1
Blogspotリンクから、実際のMD5暗号化と検証をすべて実行RewriteMapするprg://…シェルスクリプトリソースに使用するアイデアが気に入っています。これをテストして、セットアップで機能することを確認する必要がありますが、バニラApache + mod_rewriteモジュールで機能するようです。
サードパーティ、2015

1

この問題を解決する私の計画は今

  1. リクエストをPHPにリダイレクトする

    RewriteEngine on
    RewriteRule ([0-9a-z-_]+)$ authenticateUser.php?&file=$1 [L]
    
  2. PHPでユーザーを認証します(他のすべての認証方法は弱すぎるか、常にファイルに書き込む必要があります)

    if ( User::hasPermission() && isSane( $filePath ) ) {
        // 
        header( 'X-Sendfile: ' . $filePath );
    }
    
  3. Apacheを使用mod_xsendfiledocsgithub


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.