0

私はできる限りこれを説明しようとします。私は、メンバーがファイルをアップロードして販売できる (メンバーがこれらのファイルの権利を所有している) メンバー主導の Web サイトを開発しています。

前提 1: 各メンバーのフォルダーに直接アクセスできず、サイト自体からのリンクからのみアクセスできるようにしたかった。

このリンクは、それを購入した人のメンバーの領域でのみ生成されます (ファイルを複数回ダウンロードするため... また、メンバーのプロファイルでは、これらのフォルダーへのリンクも許可されていません)。

したがって、メンバーが参加するたびに、.htaccess が自動的に作成されるファイルが与えられます。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain.com/.*$ [NC]
RewriteRule .* - [F]

前提 2:ユーザーがファイルをアップロードするとき、プロセスの最後のステップは、ファイルが実際にアップロードされたことを確認することです。

$uploadFullPath = 'http://www.domain.com/userfiles/'.$_SESSION['uniqueKey'].'/'.$_SESSION['userNumber'].'-'.$_SESSION['latestUpload'].'.'.$_SESSION['latestExt'];
 if(fopen($uploadFullPath,"r")!==0){
  // update member usages
  $query = "UPDATE memberUsage SET usageLicenses=usageLicenses+1 WHERE memberNumber=".$_SESSION['userNumber'];
  mysql_query($query) or die(reportError('Unable to increment licenses used'));
  echo 'Your file has been successfully updated. You can view your listing within <a href="/user-area/">Your Dashboard</a>';
}
else{
 echo 'There seems to have been a problem uploading your file. Please <a href="/user-area/">go back</a> and try again from your \'incomplete listings\' page. Upload Path Provided: <a href="' . $uploadFullPath .'">' . $uploadFullPath . '</a>';
}

わかりやすくするために、reportError() 関数は、エラーの報告が必要なときにいつでも mysql_error() および mysql_errno() を生成して毎回入力する手間を省くプリロード関数です。

また、上記で fopen() を使用した場所では、is_file() と file_exists() を使用してファイルの存在をテストしようとしました。

上記の htaccess 制限の問題 fopen()、is_file()、および file_exists() はすべて、生成された $uploadFullPath をクリックすると機能しますが、ファイルを見つけることができません。

ただし、htaccess 制限を削除すると、上記の機能は機能しますが、同様に、最初に Web サイトを購入したり経由したりしなくても、ファイルに直接アクセスできます。

これらの条件の両方を同時に実行するにはどうすればよいですか? それがhtaccessだけなのか、ファイル検出方法だけなのか、それとも両方の組み合わせなのかはわかりません。

あなたの助けを前もって感謝します!

4

1 に答える 1

3

可能であれば、http://-wrapperの代わりにローカルファイルシステムを使用してください。

したがって、たとえば、PHPファイルが/var/www/kirby/myfile.phpであり、アップロードが(ここでも例)に保存されている場合/var/www/kirby/useruploads/cooluserone/test.jpg(アップロードされたファイルとしてtest.jpgを想定)。

この場合、相対パスfile_exists("useruploads/cooluserone/test.jpg")または完全パスのいずれかを使用できますfile_exists("/var/www/kirby/useruploads/cooluserone/test.jpg")

これは両方ともtrueを返します。

ただし、フォルダ/ファイルへの読み取りアクセス権があることを確認する必要があります。これはおそらくすでに持っています。

于 2012-05-12T14:09:51.753 に答える