web-dev-qa-db-ja.com

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

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

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

8
Cogsy

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

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

.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を再起動する必要があると思います。

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

参照:

5
Aquarion

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

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

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

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

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

1
Rugmonster

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

  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

1
Rainer Rillke

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

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

1
inf3rno

はい、mod_phpを使用している場合は、基本認証を使用してください。 http://php.net/manual/en/features.http-auth.php

0
anonymouse