2012-05-12 8 views
0

私はおそらくこれを説明しようとします。私はメンバーがそれらを販売するためにファイルをアップロードできるメンバードリブンのWebサイトを開発しています(メンバーは、これらのファイルの権利を所有しています)。PHPのfopen()とis_file()はhtaccessの制限のために動作しません

PREMISE 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、私のファイルの検出方法、または両方の組み合わせであるかどうかはわかりません。

ご協力いただきありがとうございます。

+1

ローカルファイルシステムのパス(例:/ var/www/mysite/userfiles/more/stuff/here)を使用してファイルを開くことはできませんか?それはhttpdを起動させず、.htaccessファイルを起動しません。または、リモートサーバー上のファイルですか? – ccKep

+0

私たちはローカルマシンではなく、「ライブ」ウェブサイト上のサイトについて話しています。違いがありますか? –

+0

httpdの代わりにhttp:// - ラッパーの代わりに直接オープンする方が実際には簡単です(リソースごとに)。あなたのファイルがどこにあるかを知っていれば(そしてそのファイルに読み込みアクセス権がある)、 'file_exists'と' fopen'をそれらのファイルに直接使うことができます。 – ccKep

答えて

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を返します。

フォルダ/ファイルに対する読み取りアクセス権があることを確認しておく必要があります。

+0

ありがとうございます - httpリクエストを行わずにファイルパスを使用しているようです。ありがとう! –

関連する問題