2012-05-24 3 views
8

클라이언트가 로그인하여 서버에 저장된 다양한 PDFs을 볼 수있는 웹 사이트를 개발하기 위해 노력하고 있습니다. 이 PDF는 클라이언트에게 고유 한 것이므로 로그인하지 않은 사람이 액세스해서는 안됩니다. 서버에 파일을 가져 오는 것이 문제가되지 않아야합니다. 최종 사용자에게 파일을 제공하는 방법에 대해서는 확신 할 수 없습니다.PDF 용 보안 파일 호스팅 서버 만들기

파일 대신 SQL servers의 데이터를 사용하여 이러한 종류의 작업을 구현했습니다. 따라서 가장 효과적인 방법은 무엇인지 잘 모릅니다.

웹 사이트는 LAMP이고 최소한의 경험은 PHP입니다 (프레임 워크 나 다른 언어를 사용하면이 방법을 더 쉽게 배우게됩니다).

나는 아마도 내 머리 위로 들린다.하지만 나는 보통 그렇기 때문에 어떤 입력이 좋을 것이다.

답변

9

파일을 웹 루트 외부에 둡니다. 그런 다음 PHP를 사용하여 스크립트를 통해 파일을 전달하십시오. 그런 식으로 아무도 파일에 직접 연결할 수 없으며 컨트롤을 무시할 수 있습니다. (당연히 사용자에게 해당 파일을 검색 할 수있는 권한이 있는지 확인한 후에 만이 작업을 수행하는 스크립트를 확인하십시오.)

샘플 PHP :

<?php 
    session_start(); 
    if (!isset($_SESSION['authenticated'])) { 
     exit; 
    } 
    $file = '/path/to/file/outside/www/secret.pdf'; 

    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, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
?> 
+0

는'으로 session_start()는 안 등,'로드 할 수? 나는 그것이 세션과 함께 일해야한다고 생각한다. –

+0

사실, 그렇습니다. 나는 정말 완전한 예제를 제공하지 못했던 핵심 개념에 집중했다. 이제 고칠거야 ... –

+0

그냥 확인 ;-) –

4

쉬운 방법이 긴 파일을 임의의 파일 이름 (예를 들어, 20 임의의 문자)를 제공하는 것입니다. 기술적으로 누구에게나 액세스 할 수 있지만 URL을 추측 할 수 없으므로 승인 된 사용자 만 액세스 할 수 있습니다.

또는 John Conde는 이미 PHP 스크립트에서 파일을 제공하는 방법에 대해 설명했습니다. 작은 성능 저하가 발생하지만 코드만큼 안전합니다. 추가 할 수있는 유일한 방법은 웹 루트 외부에 파일을 둘 수 없다면 .htaccess를 사용하여 사람들이 직접 파일에 액세스하지 못하게 할 수 있다는 것입니다.

+1

나는 GUID를 권 해드립니다. 이것은 여전히 ​​재미있는 것을 얻을 때까지 서버를 ping 할 수있는 문제가 있습니다. 그러나 성공의 가능성을 거의 없게 만들 수는 있습니다. 나는 .htaccess를 사용하여 폴더에 대한 액세스를 차단합니다. – zebediah49

+1

@ zebediah49 - 가능성이 있습니다. 알아 두어야 할 함정이 있습니다 (http://blogs.msdn.com/b/oldnewthing/archive/2012/05/23/10309199.aspx). 단순히 임의의 문자열을 생성하는 것이 더 안전합니다. 그리고 110 % 확실하려면 암호화 된 강력한 난수 생성 프로그램을 사용하십시오. –

+0

매우 흥미 롭습니다, 감사합니다. 길이에 대해 GUID를 선택했지만 여전히 공개적으로 액세스 할 수있는 URL을 사용하지는 않겠지 만 아주 좋은 지적입니다. – zebediah49

2

John이 올바른 기본 방법을 게시 했으므로 (아마도 열등한) 대안을 추가하고 있습니다. 데이터베이스에서 제공하십시오. PDF 용 BLOB 열을 가지고 데이터베이스에서 파일 데이터를 읽고 저장하십시오. 꽤 큰 테이블로 끝나지 만 작동 할 것입니다. 여기에 John이 게시 한대로 header()을 설정해야합니다. 파일 대신 DB에서 데이터를 전송하면됩니다. 이렇게하면 파일 이름이 충돌하지 않도록 할 필요가 없다는 장점이있다