0

特定の日付まで誰でもアクセスできないデータを含むディレクトリがあります。

当然のことながら、ディレクトリは Web ブラウザで直接誰でも読み取り可能であってはなりません。現在、これを .htpasswd と .htaccess で解決しています。

ただし、1 つ上のディレクトリ レベルには、誰でも読み取り可能な .php ファイルがあります。PHP ファイルは、日付に基づいて<img .../>、保護されたディレクトリから読み取る基本的な HTML タグ (例: ) を条件付きで生成します。

残念ながら、私のテストでは、.php ファイルはデータをロードするために認証を必要とします。私の質問は、私が何か根本的に不可能なことをしようとしているのか、それともそれを機能させるために微調整できるのかということです。また、可能であれば、知っておくべき追加の問題 (セキュリティまたはその他) はありますか?

追加情報:

  • 可能であれば、Javascript を使用しないことをお勧めします。
  • PHP 5.3 が利用可能です。
  • 解決策の他のアイデアはありますか(私はすでにcronジョブを考えていましたが、まだ実行する可能性があります)?
4

2 に答える 2

3

保護されていないphpファイルからでも出力しようとすると<img src="protected.jpg" />、HTMLは表示できますが、画像ファイル自体は表示できないという問題があると思います。

あなたがしようとしていることを正しく理解している場合は、次のいずれかが必要です。

  • 各ファイルへのアクセスを制御するために、PHP である種のプロキシ スクリプトを記述します (これは少し面倒で、適切なヘッダーと MIME タイプを生成する必要があります)。
  • 時間/日付条件を使用して .htaccess から直接アクセスを制御するには、これが最適なオプションです。そこを参照してください: http://www.askapache.com/htaccess/time_hour-rewritecond-time.html

編集:プロキシの例:オンラインで例が見つからないようなので、これはPHPからファイルへのアクセスを制御したいときによく使用する関数です(たとえば、これは$からアクセスを検証する必要がある機密データである可能性があります_SESSION または DB 値) :

function send_binary_data($path, $mimetype, $filename = null){

    @ob_clean();

    if($filename === null) $filename = basename($path);
    $size = filesize($path);

    //no-cache
    header('Cache-Control: no-cache, must-revalidate, public');
    header('Pragma: no-cache');

    //binary file
    header('Content-Transfer-Encoding: binary');

        //mimetype
    header('Content-Type: ' . $mimetype);
    header('Content-Length: ' . $size);
    header('Content-Disposition: inline; filename=' . $filename);
    header('Content-Description: ' . $filename);

    $chunksize = 1 * (1024 * 1024);
    $buffer = '';
    $handle = fopen($path, 'rb');

    if ($handle === false) {
        return false;
    }

    while (!feof($handle)) {
        $buffer = fread($handle, $chunksize);
        print $buffer;
    }

    $result = fclose($handle);
    unset($handle);
    $handle = null;

    die();

}   

もちろん、引き続き .htaccess からの直接アクセスを制限する必要がありますが、プロキシの場合は、次のようにすべてのリクエストを保護されていないプロキシ スクリプトにリダイレクトします。

RewriteEngine ON
RewriteRule ^(.*)$ /proxy.php?file=$1 [NC,QSA]

また、proxy.php には次のようなものが含まれます。

if(!isset($_GET['file'])) die('file not set');
$file = $_GET['file'];

//perform all your custom checking, including security checks due to retrieving data from $_GET, and if access is granted :

$path = 'yourpath/'.$file;
$mimetype = 'defineregardingyour/ownrules';
send_binary_data($path, $mimetype); 
于 2012-08-10T20:25:09.677 に答える
1

.htaccess は、インターネットからディレクトリへの直接のアクセス制御としてのみ機能します。

PHP アクセスは、chmod パーミッションによって制御されます。755 に chmod してみてください。.htaccess ファイルを使用して、パスワード保護またはその他の種類の保護を引き続き適用できます。

追加されたコメントを考慮して、保護されたディレクトリ内にある出力に画像を含めようとしていると思います。当然、認証されていないユーザーはそれらにアクセスできません.なぜそれらを保護したのでしょうか?

誰でもアクセスできるようにする必要があるファイルを .htaccess ファイルに追加できます。

于 2012-08-10T20:17:21.843 に答える