2012-05-12 4 views
0

나는 이것을 가능한 한 잘 설명하려고 노력할 것입니다. 저는 회원들이 판매 할 파일을 업로드 할 수있는 회원 중심의 웹 사이트를 개발하고 있습니다 (이 파일에 대한 권리를 소유하고있는 곳).htaccess 제한으로 인해 PHP fopen() 및 is_file()이 작동하지 않습니다.

PREMISE 1 : 각 회원의 폴더에 직접 액세스 할 수 없으며 사이트 자체의 링크를 통해서만 접근 할 수 있기를 바랍니다.

이 링크는 구매 한 사람의 회원 영역에서만 생성됩니다 (파일을 두 번 이상 다운로드하는 경우 ... 회원 프로필에서 이러한 폴더에 대한 링크를 허용하지 않음).

회원이 가입 할 때마다 .htaccess가 자동으로 생성되는 파일이 제공됩니다.

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

PREMISE 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인지, 내 파일 탐지 방법인지 아니면 둘의 조합인지 확실하지 않습니다.

미리 도움을 주셔서 감사합니다.

+1

로컬 파일 시스템의 경로 (예 :/var/www/mysite/userfiles/more/stuff/here)를 사용하여 파일을 열 수 없습니까? 그러면 httpd가 실행되지 않고 .htaccess 파일도 실행되지 않습니다. 또는 원격 서버에 파일이 있습니까? – ccKep

+0

우리는 '라이브'웹 사이트에있는 사이트를 말하며 로컬 컴퓨터는 아닙니다. 그게 효과가 있니? –

+0

httpd를 통해 여분의 마일을 사용할 필요가 없으므로 실제로는 http : // - wrapper 대신에 직접 열기가 더 쉽습니다 (자원별로). 파일이있는 경로를 알고 있고 그 파일에 대한 읽기 액세스 권한이있는 경우 직접'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 요청을하지 않고 파일 경로를 사용하여 지금은 제대로 작동하는 것 같습니다. 감사! –