2014-09-07 1 views
0

계정이있는 파일을 다운로드 할 수있는 시스템에서 작업하고 있습니다. 이제 모든 사람과 모든 사람이 다운로드 할 수 없게하는 데 문제가 있습니다. 어떤 힌트 또는 옵션이든 표시됩니다.PHP 계좌를 가지고있는 사람을 제외하고 모두 사용 안 함

global $AllowDownload = false; 

function Connect() 
{ 
    $Connect = mysqli_connect("127.0.0.1", "root", "12345", "film"); 

    if (mysqli_connect_errno()) 
     echo mysqli_connect_error(); 

    return $Connect; 
} 

function IsValid($Username, $Password) 
{ 
    $IsValid = false; 

    $Query = mysqli_query(Connect(), "SELECT COUNT(*) FROM `account` WHERE `username` = '$Username' AND `password` = '$Password'"); 
    $Check = mysqli_fetch_array($Query); 

    if ($Check[0]) 
     $IsValid = true; 

    return $IsValid; 
} 

if (!isset($_SERVER['PHP_AUTH_USER'])) 
{ 
    header('WWW-Authenticate: Basic'); 
    header('HTTP/1.0 401 Unauthorized'); 
    exit(); 
} 
else 
{ 
    $Username = mysqli_real_escape_string(Connect(), $_SERVER['PHP_AUTH_USER']); 
    $Password = mysqli_real_escape_string(Connect(), $_SERVER['PHP_AUTH_PW']); 

    if (IsValid($Username, $Password)) 
    { 
     $AllowDownload = true; 
    } 
    else 
    { 
     header('HTTP/1.0 401 Unauthorized'); 
    } 
} 

답변

1

PHP 스크립트는 먼저 파일 프록시로 작동해야합니다. query 매개 변수를 사용하여 요청 된 파일을 스크립트에 전달할 수 있습니다 (예 : proxy.php?file=myfile.jpg. 이것은 매우 심해서 .htaccess 파일을 사용하여 크게 향상시킬 수 있습니다.

아주 간단한 파일 프록시의 빠른 스케치는 다음과 같습니다마다 당신이 당신의 호스팅에있는 파일에 그 같이, 클라이언트가 액세스 할 수

<?php 
    /* authorize user here */ 

    if(!$authorized) die("No content for you!"); 
    else { 
    header("Content-Type: application/octet-stream"); 
    readfile($_GET["file"]); 
    } 
?> 

당신은 그러나 알고 있어야합니다. 따라서 사용자가 실제로 파일을 제공하고 있는지 확인해야합니다 (적어도 사용자가 ../과 같은 디렉토리를 변경하려고 시도하지 않도록하십시오.)

Connect 기능을 확인하십시오. 아마도 mysqli에서 작동 할 수 있습니다 나는 PHP 특히 이러한 낮은 수준의 기능)를 사용하지만, 여전히 매우 불쾌한 이후 오랜 시간 당신의 연결을 감싸고 싱글 톤 패턴의 어떤 종류를 형성하기 위해 확실히 좋습니다 -이 같은 :.

$connection = false; 
function connect() { 
    global $connection; 
    if(!$connection) { 
    // connect here 
    } 

    return $connection 
} 

(이것은이다 물론 올바르게 구현 된 싱글 톤은 아니지만 연결이 한 번만 초기화됩니다)

+0

당신이 말한 부분은 이제 프록시가 잘 작동하지만 사용자는 여전히 직접 링크를 통해 다운로드 할 수 있으므로 사용자가 다운로드하지 못하도록 제안하는 방법은 무엇입니까? – DarkOne

+0

파일을 웹 서버를 통해 직접 액세스 할 수없는 디렉토리에 배치해야합니다. 그렇지 않으면'.htaccess' 파일이 친구입니다. [this] (http://pastebin.com/dVdDeT11)과 같은 것이 효과가 있습니다. 내가 잘못하지 않았다면, 디렉토리에있는 모든 비 PHP 파일에 대한 요청은'/ files/proxy.php' 스크립트로 리디렉션됩니다. –

0

이이 코드 블록을 다음과 같이 수행 할 수 있습니다

내 코드 감사합니다 유용합니다. 다운로드 가능한 유효한 조건 블록 내에 코드 블록을 놓습니다.

if($AllowDownload) 
{ 
    $file = "/your/file/fullpath/filename.jpg"; 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 

그리고 실제 파일이 공용 HTML 디렉토리에 존재하는지 확인하십시오.

+0

다운로드를 비활성화하는 방법은 무엇입니까? 이런 식으로 사용자는 http://example.com/1990/theif.kmv – DarkOne

+0

과 같은 링크로 파일을 다운로드 할 수 있습니다. 허용하려는 위치에 코드를 넣기 만하면됩니다. '$ IsValid = true;를 만드는 장소. 허가되지 않은 물약에서 여러분은 이미 header ('HTTP/1.0 401 Unauthorized');'를 만들 때 헤더를 설정하십시오. – sugunan