2011-11-25 3 views
0

폴더 및 파일 권한 작동 방식에 대한 몇 가지 질문이 있습니다. 내가 사용자 A 디렉토리에서 아무것도 액세스 할 수있는 권한이없는 사용자 B를 원하지 않는php 폴더 및 파일 권한

users 
    -- usera 
    -- docs 
    -- userb 
    -- docs 
protected 

.. 내가 사용자 디렉토리 외부 아래와 같이 '보호'가 있다고. 또한, 어떤 사람이 URL 링크를 통해 디렉토리 디렉토리에 액세스하는 것을 원하지 않습니다. 기본적으로 나는 사용자가 자신의 디렉토리에 액세스 할 수 있기를 원합니다. 어떻게 할 수 있습니까?

감사합니다.

+1

더 많은 컨텍스트가 필요합니다. 방법에 액세스 하시겠습니까? "보호 된"의 관련성은 무엇입니까? – deceze

+0

액세스를 읽거나 파일을 다운로드하십시오. protected는 PHP 스크립트를 호스팅하기 위해 .htaccess 'all deny from all'을 가진 디렉토리입니다. – twb

+0

보통 "파일 시스템"인 "사용 권한"에 대해 이야기하기 때문에 다소 혼란 스럽습니다. 웹 서버를 통해 파일에 액세스 할 때 더 추상적 인 사용 권한에 대해 이야기하는 것 같습니다. 그렇지 않습니까? – deceze

답변

1

나는 여기에 limiting users to subdirectories이라는 당신이 필요에 맞게 조정할 수 있어야만하는 simular 질문에 대답했다.

Download.php

<?php 
/** Load your user assumed $user **/ 

$file = trim($_GET['file']); 

/** Sanitize file name here **/ 

if (true === file_exists('/users/user'.$user->id.'/'.$file)) { 
    //from http://php.net/manual/en/function.readfile.php 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.$file.'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} else { 
    throw new Exception('File Not Found'); 
} 

htaccess로는 /download.php?file=filename.ext를 사용하여 모든 직접 파일 다운로드

deny from all 

그런 다음 폴더에 링크 할을 거부하고 그것에 현재 사용자의 users 디렉토리에서만 해당 파일을 다운로드합니다.

디렉토리 횡단 공격에 취약하지 않도록 입력 파일 이름을 보호해야합니다.

+0

안녕하세요, 서버에 부담이 가중 될까요? 100 명의 사용자가 한 번에 서로 다른 1MB 파일 (100x100MB)을 다운로드하면 메모리 또는 처리 능력이 저하됩니다. – twb

+0

yup..i는 xsendfile과 함께이 방법을 사용할 것이라고 생각합니다. 건배 – twb

1

더 이상의 정보가 없으면 내 사용자 디렉토리가 웹 루트 위에 있는지 확인하는 것이 좋습니다. 이렇게하면 연결되지 않습니다. 그런 다음 사용자가 자신이 말하는 사람인지 확인하는 PHP 스크립트를 만듭니다. 로그인 한 사용자의 신원을 알았 으면 fpassthru() (http://php.net/fpassthru) 또는 유사하게 문서를 사용자에게 전달할 수 있습니다.

+0

안녕하세요. 다른 정보는 무엇이 필요합니까? passthr을 사용하면 서버에 많은 처리 부하가 걸릴 것이라고 생각하기 때문에 다른 방법이 있습니까? – twb

+0

속도와 서버 리소스 사용과 관련하여 fpassthru PHP 페이지에 흥미로운 의견이 있습니다. fread를 사용하는 것이 아마도 실제로 빠릅니다. 해당 팁에 대한 좋은 조언을 보려면 해당 페이지의 주석을 스캔해야합니다. PHP 함수를 사용하고 싶지 않다면, mod-auth-token http://code.google.com/p/mod-auth-token/ – Daniel

+0

mod-auth-token처럼 보일 수 있습니다. 하지만 공유 호스팅에서 이것을 얻을 수 있습니까? – twb