5

レイアウトは次のとおりです。

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

これまで、管理ディレクトリを .htaccess passwd で保護していました。そのディレクトリ内のすべてのファイル (js スクリプト、jpg、pdf などを含む) に対する完全なアクセス制御が必要だからです。一方、私のカスタム CMS は、他の URL に対して PHP セッション / Cookie を使用して認証を提供します。私が達成したいのは、.htaccessで保護されたディレクトリに同じPHP認証を使用し、すでにPHP認証されたユーザーのユーザー/パスワードのポップアッププロンプトを回避することです。要約すれば:

  • 管理ディレクトリが認証に .htaccess ルールを使用するようにしたい
  • ユーザーがすでに PHP を使用して認証されている場合 (HTML フォームで、保護されていないファイルにログイン)、管理ディレクトリのコンテンツにアクセスするときに 2 番目の .htaccess 認証プロセスをバイパスします。
  • PHP 認証されていないユーザーが管理ディレクトリのコンテンツにアクセスしようとすると、HTTP 認証ポップアップがトリガーされます。

私が読んだもののほとんどは、管理ディレクトリを Web ルートの外に移動し、readfile を使用して PHP スクリプトからファイルにアクセスすることを提案していますが、これはやりたくありません。そのディレクトリには動的コンテンツと静的コンテンツがあります。リソースをロードする前にApacheが認証ポップアップをトリガーすることはわかっているので、問題はユーザーがすでに認証されていることをApacheに認識させる方法です。他の提案/回避策はありますか?

4

1 に答える 1

9

.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

この行は、Cookie に PHP セッション ID が設定されているかどうかを確認し、設定されている場合は認証プロセスにSetEnvIf Cookie PHPSESSID=.* PASS=1十分であり、設定されている場合はログイン プロンプトをスキップします。SatisfyAllow from env=PASS

session_start()繰り返しになりますが、この例は、認証試行が成功せずに呼び出されたときに PHP セッション Cookie が既に設定されているため、あまり安全ではありません。例えば:

SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1

そうすれば、AJNC3Z921dmc4O8P2PHP による認証が成功したときに cookie の値を設定すると、認証プロセスを通過するのに十分です。ただし、ログイン プロンプトを長時間通過できないようにするために、適切な Cookie の有効期限を必ず設定してください。

于 2012-12-28T09:13:54.483 に答える