2012-06-09 6 views
4

2 대의 서버가 있습니다. 서버 1에는 워드 프레스 웹 사이트가 있습니다. 서버 2에는 WordPress 사이트의 회원이 다운로드 할 수있게하려는 큰 .zip 파일이 있습니다.원격 서버의 다운로드 보호

웹 사이트의 회원 인 사용자 만 두 번째 서버에서 파일을 다운로드 할 수 있도록 이러한 사용자를 인증하려면 어떻게해야합니까?

내 도메인의 리퍼러 만 파일에 액세스 할 수 있도록 PHP를 사용할 수 있습니까?

참고 : 파일을 다운로드하는 링크는 WordPress 사이트에서 보호되어 로그인하지 않은 사용자는 가입 페이지로 리디렉션됩니다. 그러나 현재 회원과 전 회원은 다운로드가있는 디렉토리를 여전히 알고 파일을 다운로드하거나 링크를 공유 할 수 있습니다.

+0

현재 타임 스탬프에 기초하여 토큰 사용에 대해주의. 같은 시간에 얼마나 많은 일이 일어날 수 있는지, 시간에 기반한 토큰을 사용하는 것은 매우 나쁜 생각입니다. 문자열에 접두사가 없으면 고유해야합니다. 데이터베이스에서 생성 된 고유 한 ID로 무언가를 시도하면 완전히 안전합니다. – B4NZ41

답변

6

이렇게하는 방법에는 여러 가지가 있습니다.

서버 2 :

<?PHP 
$file = $_GET['f']; 
$code = $_GET['c']; 
$ip = $_SERVER['REMOTE_ADDR']; 

if ($code != md5($ip . 'salt')) { 
    die('authentication denied'); 
} 

if(!file) 
{ 
    die('file not found'); 
} 

// Set headers 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=$file"); 
header("Content-Type: application/zip"); 
header("Content-Transfer-Encoding: binary"); 

// Read the file from disk 
readfile('/files/downloads/' . $file); 

?> 

서버 1 download.php 가장 안전한 방법은 여기 서버 1 개 & 서버 2 사이에 약간의 백 - 엔드 통신을하지만,하는 것입니다 것은 쉬운 대안입니다 : 다운로드 링크

<?PHP 
echo '<a href="http://server2.com/download.php?f=text.txt&c=' . md5($_SERVER['REMOTE_ADDR'] . 'salt')/'">Download File</a>'; 
?> 

이 시스템은 단지 그것을 위해 생성 된 IP에 사용할 수있는 링크를 생성하여 작동합니다. 따라서 등록 된 사용자는 다른 곳에서 링크를 공유 할 수 없습니다. 가장 안전한 것은 아니지만 쉽게 구현하고 사용할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 서버 2 코드의 경우 도메인에 배치해야하거나 서버의 IP에 직접 업로드 할 수 있습니까? 나는 또한 "디스크에서 파일 읽기"섹션을 가정합니다 - 파일이 readfile ('my/download/path/here'디렉토리에 있어야합니다.) – user1446650

+0

server2의 코드는 공개적으로 액세스 할 수 있어야합니다. 예/"/ files/downloads /"를 귀하의 필요에 맞게 변경하십시오. –

1

일부 깔끔한 해결책은 현재 시간을 기준으로 토큰 시스템을 사용하는 것일 수 있습니다. 오늘의 현재 시간을 가져 와서 소금으로 해시 한 다음 쿼리 문자열에 토큰으로 넣을 수 있습니다. 두 번째 서버의 PHP 스크립트보다 쿼리 문자열 해시가 같은지 확인합니다. 해시가 서버 측에서 같은 시간대의 현재 시간에 대해 생성 된 것과 같습니다.

사용자가 시간 전환 시간을 맞추지 않도록하려면 이전 시간 해시도 확인할 수 있습니다.

1 시간의 사용 가능 시간을 보장하면서 파일 URL을 2 시간 이상 사용할 수 없음을 확신합니다. 서버 (1)에

:

<?php 
echo '<a href="server2.com/download.php?token='.md5(date('G')+'secret_word').'&file=file.zip">Link</a>'; 
?> 

서버 (2) 중 :

<?php 
current_hour_hash = md5(date('G').'secret_word'); 
previous_hour_number = (int(date('G')) - 1) % 24; 
previous_hour_hash = md5(str(previous_hour_number).'secret_word'); 
if($_GET['token']!= current_hour_hash and $_GET['token']!= previous_hour_hash){ 
    die(); 
}else{ 
    ... //code sending file here 
}