0

我将尽我所能解释这一点。我正在开发一个会员驱动的网站,会员可以上传文件以出售它们(他们拥有这些文件的权利)。

前提 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 限制,上述功能可以正常工作,但同样可以直接访问文件,而无需先购买或通过网站。

请问如何让这两个条件同时运行?我不确定它是否只是 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 回答