2012-12-28 17 views
5

ここではレイアウトがあります:PHPと.htaccess認証ソリューション

web root 
    - admin (dir) 
     - index.php 
     - js 
     - img 
     - other files/dirs 
    - dir 
    - files 

今まで、私はJS含め、そのディレクトリ内のすべてのファイル(スクリプトの完全なアクセス制御をしたいので、.htaccessファイルのpasswdを持つ管理者のディレクトリを保護JPG 、pdfなど)。一方、私のカスタムCMSは、PHP sesssion/cookieを使って他のURLに認証を提供します。私が達成したいのは、.htaccessで保護されたディレクトリに対して同じPHP認証を使用し、既にPHPで認証されたユーザのユーザ/パスワードのポップアッププロンプトを避けることです。要約:

  • 私は、ユーザーが既に(非保護されたファイルには、HTML形式でログイン)PHPを使用して認証されている場合、管理者dirが認証
  • のための.htaccessのルールを使用したい、バイパス第二の.htaccess認証プロセス認証されたユーザがadminディレクトリ内のコンテンツにアクセスしようとした非PHPは、HTTPの認証ポップアップがトリガされなければならない場合は、管理者のdirコンテンツ
  • にアクセスする際に

私がきたものの大部分Webルートとアクセス権の外に管理ディレクトリを移動するように指示する彼は私がしたくないreadfileをPHPスクリプトからファイルします。そのディレクトリには静的コンテンツと動的コンテンツがあります。私はapacheがリソースをロードする前にauthポップアップを起動するので、ユーザーがすでに認証されていることをApacheに認識させる方法が問題だと思います。その他の提案/回避策?

+1

phpでHTTP認証を行います> http://php.net/manual/en/features.http-auth.php> http://koivi.com/archives/php-http-auth/ –

+2

ここでPHPを使って解決することができます:http://php.net/manual/en/features.http-auth.php .htaccessファイルなし。 Cookie Stuffについては、http://www.askapache.com/htaccess/htaccess-fresh.html#Get_Cookie_Valueをご覧ください。ユーザーがログインした後、Cookieが設定されます。 htaccessファイルは、そのクッキーをチェックする必要があります。セッションクッキーにはセッションハッシュしか含まれていないので、これはphpセッションではうまく機能しません。 –

答えて

7

.htaccessファイルの変数SetEnvIfを使用して、特定のCookie値が設定されているかどうかを確認できます。 (これは、ただ説明のため、非常に安全ではない)例:

AuthType Basic 
AuthName "Protected Login" 
AuthUserFile "/path/to/.htpasswd" 
AuthGroupFile "/dev/null" 
SetEnvIf Cookie PHPSESSID=.* PASS=1 
Order deny,allow 
Deny from all 
Allow from env=PASS 
Require valid-user 
Satisfy any 

クッキーがPHPセッションIDで設定し、そうであれば、それはSatisfy認証処理とするのに十分であるSetEnvIf Cookie PHPSESSID=.* PASS=1か否かをチェックラインAllow from env=PASSは、これが当てはまる場合はログインプロンプトをスキップします。

この例では、成功した認証を試みることなくsession_start()が呼び出されたときにPHPセッションクッキーが既に設定されているため、あまり安全ではないため、推測が難しいより暗号的/ランダムなCookie値を設定する方がよいでしょう。たとえば:あなたはPHPを通じて成功した認証時にAJNC3Z921dmc4O8P2のクッキーの値を設定している場合

SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1 

そうすれば、これは認証プロセスを通過するのに十分だろう。長期間ログインプロンプトが表示されないように、Cookieの有効期限を正しく設定してください。

+1

素晴らしい作品、ありがとうOldskool!今のところクッキー全体のセキュリティがどれくらい安全かはわかりませんが、すべてのPHPスクリプトで、そのディレクトリの動的コンテンツにアクセスするための適切なアクセス許可を二重にチェックします。 'SetEnvIf Cookie AUTHCOOKIE = randomstring $ PASS 1'のようにregexpの終了$を使うことをお勧めします。それ以外の場合は' randomstring1'がマッチします。 – Stingus