2009-11-22 9 views
11

반 누출 다운로드 스크립트를 작성 중입니다. 세션 ID로 명명 된 임시 파일을 작성한 다음 세션이 만료되면 파일이 자동으로 삭제됩니다. 가능한가? PHP에서 어떻게 할 수 있는지 알려주시겠습니까? 어떤 응답임시 파일 만들기 및 자동 제거

+0

파일을 보관할 기간은 얼마입니까? – Ikke

+0

달성하고자하는 목표에 대해 구체적으로 알려주십시오. 안티 리칭 DL 스크립트는 다소 모호합니다. 스크립트가 해결하고자하는 UseCase 또는 문제점은 무엇입니까? – Gordon

+0

안녕하세요 lkke, 그냥 다른 사람에게 링크를 복사하여 붙여 넣기 할 수 없기 때문에 세션을 다운로드해야합니다. 안녕하세요 Gordon, 사용자가 파일을 다운로드하도록 강요하고 싶습니다. 내 사이트, 속도를 제어 할 수 있습니다. 그래서 임시 파일을 임시 디렉토리에 만들어서 사용자가 다운로드하여 세션을 만료 한 후 자동으로 제거 할 수 있도록 할 생각입니다. – mrblue

답변

9

그래서 하나 이상의 파일을 다운로드 할 수 있습니다. 각 다운로드 요청에 대한 임시 파일을 만드는 것은 좋은 생각이 아닙니다. 대신에 각 파일에 대해 symlink()을 만드는 것이 훨씬 좋습니다. 이렇게하면 많은 디스크 공간을 절약하고 서버 부하를 낮출 수 있습니다.

사용자 세션이 끝나면 심볼릭 링크의 이름을 지정하는 것이 좋습니다. 더 좋은 방법은 임의의 심볼릭 링크 이름 &을 세션과 연관시켜 생성하므로 스크립트는 세션 당 여러 번의 다운로드를 처리 할 수 ​​있습니다. session_set_save_handler() (link)을 사용하고 만료 된 세션을 확인하고 세션이 만료되면 심볼릭 링크를 제거하는 사용자 정의 read 함수를 등록 할 수 있습니다.

+1

안녕 pygorex1, 이것은 정확히 내가 찾고있는 것입니다. 정말 고마워. – mrblue

+0

문제는 php 버전 5.2에서 symlink가 작동하지 않습니다. – coderama

+0

링크가 이제 404이며, 문제를 해결할 수 있도록 ping 된 것입니다. –

8

PHP에 대한

정말 고마워요 그 이름 tmpfile하는 기능을 가지고있다. 임시 파일을 작성하고 자원을 리턴합니다. 다른 모든 리소스와 마찬가지로 리소스를 사용할 수 있습니다.

예. 설명서의 예 :

파일을 닫으면 (fclose() 사용) 스크립트가 종료 될 때 자동으로 제거됩니다. 리소스에 대한 파일 함수를 사용할 수 있습니다. 이 here을 찾을 수 있습니다. 희망이 당신을 도울 것인가?

또 다른 해결책은 정기적 인 방법으로 파일을 만들고 cronjob을 사용하여 세션이 만료되었는지 정기적으로 확인하는 것입니다. 만기 날짜 및 기타 세션 데이터는 데이터베이스에 저장 될 수 있습니다. 스크립트를 사용하여 해당 데이터를 쿼리하고 세션이 만료되었는지 확인하십시오. 그렇다면 물리적으로 디스크에서 제거하십시오. 1 시간에 한 번 스크립트를 실행하십시오 (시간 제한에 따라 다름).

+0

세션이 만료 될 때가 아니라 파일이 스크립트 끝/fclose()에서 삭제되므로 mrblue의 질문에 대한 해결책이라고 생각하지 않습니다. –

+0

당신 말이 맞아요. 그 부분을 읽었어야합니다. 내 게시물에 더 많은 정보를 추가했습니다. 이제 그에게 달렸습니다;) – TheGrandWazoo

+0

안녕하세요 TheGrandWazoo, 답변 해 주셔서 감사합니다. 나는 그 해결책에 대해 생각해 왔지만, 사이트가 확장되고 필립이 맞다면 성능 문제로 인해 가능하지 않을 수있다. 내 관심사는 PHP가 세션이 만료 된 후 자동으로 호출되는 "후크"기능을 지원한다는 것이다. 시작됩니다. – mrblue

2

먼저 파일을 복사하지 말 것을 제안합니다. 다음과 같이 할 것입니다 : 사용자가 파일을 요청하면 임의의 고유 한 문자열을 생성하여이 방법으로 링크를 제공합니다. dl.php?k=hd8DcjCjdCkk123 다음이 문자열을 데이터베이스에 저장하고 IP 주소, 세션 및 생성 시간을 저장합니다. 링크. 그런 다음 다른 사용자가 파일을 요청하고 모든 항목 (해시, IP 등)이 일치하는지 확인하고 링크가 만료되지 않았는지 확인합니다 (예 : 생성 이후 N 시간이 지났음). 모든 것이 정상이면 PHP를 파이프로 사용하십시오. 파일. DB를 살펴보고 만료 된 항목을 제거하도록 cron 작업을 설정하십시오. 어떻게 생각해? tmpfile

은 읽기 - 쓰기에 고유 한 이름으로 임시 파일을 생성 모드와 (+ W) 파일 핸들을 반환합니다. 파일은 (fclose() 사용) 또는 스크립트가 종료 될 때 이 자동으로 제거됩니다.

+0

세션이 만료 될 때가 아니라 파일이 스크립트 끝/fclose()에서 삭제되므로 mrblue의 질문에 대한 해결책이라고 생각하지 않습니다. –

+0

안녕 roddik, 필립이 옳았다는, 그 해결책에 대해 생각하지만 예, 정말 사용자 $의 _SESSION (실제로 내가 한) 원하는 특히 성능 문제 – mrblue

3

문제를 좀 더 깊이 설명해 주시겠습니까? 왜냐하면 나는 왜 $_SESSION을 사용하지 않을 이유가 없기 때문입니다. $_SESSION의 데이터는 서버 측에 파일로 저장됩니다 (http://php.net/session.save-path 참조). 적어도 기본적으로. ;-)

+0

안녕 필립, 내 상황에 적용 할 수 없습니다 만, "후크"동작과 같은 무언가에 대해 언급 할 문서 나 항목을 찾을 수 없습니다. 예를 들어 세션이 만료되거나 시작된 후 시스템이 자동으로 호출하는 기능을 만들 수 있습니다. 그것은 내 생각과 관심사입니다. 시간 내 주셔서 감사합니다. – mrblue

+0

다른 길로 가십시오. 세션이 만료되지 않을 때 새로운 세션이 생성되면 반응합니다 (예 : $ _SESSION이 비어 있고 이전에 채웠습니다). 문제는 세션이 사용자가 취한 조치없이 만료 될 수 있다는 것입니다 (세션이 오래되어 가비지 수집기에서 제거됨). 너 정확히 뭘하려는거야? –

2

좋아, 지금까지

  1. 더 복사 &는
  2. 사용자가 다른 사람에 대한 링크를 붙여없는 그/그녀의 세션에서 사용자를 다운로드하자 그래서 우리는 다음과 같은 요구 사항이 사이트에서 다운로드하려면 더 핫 링크
  3. 제어 속도는

보자 없습니다.이 코드 작동하지 않습니다, 그러나 그것은이 라인을 따라 작동합니다 :

<?php // download.php 

session_start(); // start or resume a session 

// always sanitize user input 
$fileId = filter_input(INPUT_GET, 'fileId', FILTER_SANITIZE_NUMBER_INT); 
$token = filter_input(INPUT_GET, 'token', FILTER_UNSAFE_RAW); 
$referer = filter_input(INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_URL); 
$script = filter_input(INPUT_SERVER, 'SCRIPT_NAME', FILTER_SANITIZE_URL); 

// mush session_id and fileId into an access token 
$secret  = 'i can haz salt?'; 
$expectedToken = md5($secret . session_id() . $fileId); 

// check if request came from download.php and has the valid access token 
if(($expectedToken === $token) && ($referer === $script)) { 
    $file = realpath('path/to/files/' . $fileId . '.zip'); 
    if(is_readable($file)) { 
     session_destroy(); // optional 
     header(/* stuff */); 
     fpassthru($file); 
     exit; 
    } 
} 
// if no file was sent, send the page with the download link. 
?> 
<html ... 

<?php printf('a href="/download.php?fileId=%s&amp;token=%s', 
       $fileId, $expectedToken); ?> 

... 
</html> 

을 그리고 그것 뿐이다. 데이터베이스가 필요하지 않습니다. 이는 요구 사항 1 ~ 3을 다루어야합니다. PHP로 속도를 제어 할 수는 없지만 파일을 보낸 후에 세션을 파괴하지 않으면 세션에 카운터를 작성하고 세션 중에 사용자가 전송할 파일 수를 제한 할 수 있습니다.

나는이 monkeyform 해킹보다 훨씬 더 우아하게 해결할 수 있다는 것에 진심으로 동의하지만, 개념 증명으로 충분해야합니다.

+0

안녕 고든, 그건 내 코드에서 작성한 것의 거의 90 %이지만 토큰을 사용하면 보안 체크가 잘됩니다. 그 점에 대해 많은 것을 알고 있습니다. – mrblue

+0

토큰이 보안을 추가하지만 토큰이 세션 + 파일에 고유하기 때문에 파일을 심볼릭 링크하거나 더 이상 복사하지 않아도됩니다. 토큰은 기본적으로 pygorex1이 심볼릭 링크 이름으로 생성하는 토큰입니다. 나중에 어떻게 든 제거해야 할 기호 링크를 작성하는 대신, 정규 파일 ID로 이름/토큰을 보내면됩니다. 적은 유지 보수. – Gordon

0

어쩌면 응답하는 데 늦을 지 모르지만 기능을 공유하려고합니다. googlize! 핫 링크 : 당신의 cPanel를 사용하는 경우

이름은 호스팅 된 파일을 외부 요청을 차단하기위한 짧고 빠른 방법이있다.

당신은 Cpanel에서 HotLinks를 사용할 수 있으며 아무도 다른 호스팅에서 파일을 요청하거나 파일을 다운로드 참조로 사용할 수 없도록 할 수 있습니다.

0

이것을 달성하려면 하나의 파일을 만들어 chmod를 사용하여 보호해야합니다. 대중에게 공개되지 않습니다. 또는 데이터베이스 테이블 행에 내용을 저장하고 필요할 때마다 가져옵니다.

파일로 다운로드 가능하도록 설정. 이렇게하려면 보호 된 파일의 내용을 가져 오거나 데이터베이스 테이블에 저장되어있는 파일을 가져 와서 출력하면됩니다. PHP 헤더를 사용하여 원하는 이름, 확장명을 지정하고 형식을 지정하고 마지막으로 브라우저가 출력을 견고한 파일로 다운로드하도록합니다.

이렇게하면 보호 된 파일이나 데이터베이스 중 한 곳에서만 데이터를 저장하면됩니다. 사용자가 로그인하는 등의 조건이 충족 될 때까지 클라이언트 브라우저에 다운로드하도록합니다. 디스크 공간에 대해 걱정할 필요없이 파일의 임시 파일, cronJob 및 자동 삭제를 수행 할 필요가 없습니다.