2013-08-09 2 views
-1

이전에 논의 된 적이 있었지만 신속하고 깨끗한 솔루션을 찾을 수 없습니다..htaccess 및 PHP를 통해 파일을 보호하십시오.

1) 내 /data/ 폴더에있는 파일의 무리가 : 등 .JPG, .gif 참고 .MP4, .PDF,

2)가 각 요청을 잡을 것 /data/.htaccess 파일을 만들려면 및 PHP는 프로세서에 리디렉션, 예를 들면 :

/data/filename.jpg -> /data/processor.php?file=filename.jpg 

3)로 할 것 processor.php은 다음과 같습니다

3A) 유효한 $_SESSION['logged_in'] == TRUE

이 있는지 확인

3B) 그래서 현재의 모든 파일 요청이 AS LONG 당신이 로그인 유효한 남아있을 것입니다, 헤더에게

3C) 보내기 파일 데이터

이상적으로 htaccess로 리디렉션 브라우저의 URL을 변경하지 않습니다

해당 보냅니다.

편집 : 그것은 더 나은 방법은 웹 루트의 외부에 내 파일을 유지하는 것입니다 제안되면서

. 따라서 /html/data/processor.php 만 남겨두고 웹 루트 외부의 모든 미디어 파일 (예 : .jpg 및 .mp4)을 /media/으로 옮깁니다.

+1

웹 루트 외부에 이와 같은 파일을 넣는 것이 가장 좋습니다. 파일은 직접 다운로드 할 수 없으며 PHP는 아무 문제없이 파일에 액세스 할 수 있습니다. 그런 다음 파일에 해당하는 id를 php에 전달하거나 htaccess를 사용하여 경로 아래의 모든 요청을 PHP로 리디렉션하고 경로를 파싱하여 파일 이름을 가져옵니다. –

+0

은 웹 루트 외부에서 파일을 보관하는 것에 동의합니다! 좋은 지적 +1 – Geo

답변

3

브라우저에서 URL을 변경하지 않으려면 리디렉션 대신 URL 재 작성이 필요합니다. 당신의 .htaccess 파일은 다음과 비슷한 모습이 될 것입니다 실제로 브라우저에서 URL에 아무것도하지 않고 /data/processor.php?file=filename.jpg를 요청하기 위해이 /data/filename.jpg에 요청을하게됩니다

RewriteEngine On 
RewriteRule ^data/(.+) /data/processor.php?file=$1 [L] 

. 그런 다음 processor.php 스크립트가 거기에서 인계받을 수 있습니다.

서버 구성 내에서 mod_rewrite를 사용하도록 설정해야합니다.

기타 사항. 보안 또는 유용성이 더 중요한 항목에 따라 이러한 파일을 문서 루트 외부에 보관할 수도 있고하지 않을 수도 있습니다. 어떤 이유로 든 htaccess 부분이 실패하면 기본적으로 파일에 액세스 할 수 있도록 하시겠습니까? 즉,이 경우 사용자의 액세스 권한에 대한 의심의 이익을 사용자에게 제공합니까? 그렇다면 URL이 사용자가 기대하는 파일을 전달하고 전달하기 때문에 파일을 그대로 두는 것이 가장 좋습니다. 액세스 권한을 부여하지 않는 쪽에서 오류가 발생하면 문서 루트 외부에서 파일을 옮기는 것이 좋을 것이므로 스크립트를 통해 mod_rewrite 규칙을 사용하지 않고 액세스 할 수 없습니다. 어디를에 따라 $_GET['file'] 필요한 경우와 함께 경로를 포함해야합니다

<?php 
// Get MIME Type 
    $finfo  = finfo_open(FILEINFO_MIME_TYPE); 
    $mime_type = finfo_file($finfo, $_GET['file']); 
    finfo_close($finfo); 

// Send headers 
    header("Content-Type: $mime_type"); 
    header("Content-Length: " . filesize($_GET['file']); 

// Send file data 
    readfile($_GET['file']); 
?> 

: 여기 /data/processor.php

는 프로세서의 모습 수 있는지의 샘플입니다 파일 찾기가 끝납니다.

+0

내가 사용해야하는 알려진 PHP 스크립트가 있습니까? Session 변수를 검사하는 것과 마찬가지로 큰 것은 아니지만 각 확장을 적절한 헤더로 일치시킨 다음 파일 내용을 출력합니다. 어떻게해야합니까? – Geo

+0

@Geo [header] (http://www.php.net/header)에 대한 PHP 매뉴얼 페이지를 살펴보면, 사용자 의견에는 잘 작동 할 몇 가지 예가 나와 있습니다. [this]와 같은 것 (http://us1.php.net/manual/en/function.header.php#102175) –

+0

@Geo : @Jonathan Kuhn이 언급 한 스크립트를 한 가지 사소한 예외로 따르는 것이 좋습니다. 확장을 MIME 형식에 맞추려고하는 대신,'FileInfo' 함수를 체크 아웃하는 것이 좋습니다 : http://www.php.net/manual/en/ref.fileinfo.php. –

0

다음은 나를 위해 해결 된 완벽한 솔루션입니다. 경우에 대비해 누구에게나 유용 할 수 있습니다. 고맙습니다 @ 닉 쿠온!

htaccess로 파일 /html/media/.htaccess

RewriteEngine On 

RewriteCond %{REQUEST_URI} \.(png|jpe?g)$ [NC] 
RewriteRule ^(.+) index.php?file=$1 [L] 

프로세서 파일 /html/media/index.php

<?php 

require_once '../config/config.php'; 

// must be logged in 
if (! @$_SESSION['logged_in']) exit('Access denied. You are not logged in.'); 

// check if file exists 
$file = dirname(dirname(getcwd())) . '/media/' . @$_GET['file']; 
if (! is_file($file)) exit('404'); 

// Get MIME Type 
$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mime_type = finfo_file($finfo, $file); 
finfo_close($finfo); 

// Send headers 
header("Content-Type: $mime_type"); 
header('Content-Length: ' . filesize($file)); 

// Send file data 
readfile($file); 

/* End of file */ 

Media 폴더 /미디어/

.png and .jpg files are stored here outside of the web-root 

/html/media/bike.png에 대한 요청은 로그인 한 사용자에게만 적용됩니다.

관련 문제