음, 이론적으로는 없습니다. 해당 시스템을 악용 할 수있는 방법이 없어야합니다. 그러나, 당신이 생각하지 못했을지도 모르는 몇 가지 것이 있습니다.
먼저 파일이 PHP 파일 (적절한 헤더가있는 readfile()
이라고 가정)을 통해 다운로드되므로 사용자가 액세스 할 수없는 장소에 파일을 배치해야합니다. 아파치 서버에서 일반적으로 가장 쉬운 방법은 .htaccess 파일을 업로드 디렉토리에 넣고 "deny from all"을 사용하여 외부 액세스를 방지하는 것입니다. 사용자가 처음부터 외부에서 파일에 액세스 할 수 없다면 문제가되는 파일 확장자에 대해 실제로 걱정할 필요가 없습니다. (저장 목적으로 변경하면 여전히 좋은 아이디어입니다.)
두 번째로 해시 파일은 훌륭한 아이디어가 아닐 수도 있습니다. 결국 충돌이 발생할 수 있기 때문입니다. 두 파일의 해시가 같은 경우 어떻게할까요? 말할 필요도없이 해시를 계산하는 것은 느린쪽에, 특히 더 큰 파일 (이름이 아니라 파일 내용에서 계산 된 경우)에 조금 있습니다. 데이터베이스에 항목을 저장하기 때문에 auto_increment 필드와 같은 일종의 기본 키가 있다고 가정합니다. 해당 ID 번호를 충돌을 피하기위한 저장소의 파일 이름으로 사용하는 것이 좋습니다 (모름이있는 경우 마지막 삽입시 ID가 mysql_last_insert_id()
을 통해 얻을 수 있음)
물론 문제가있을 수 있습니다. 파일을 다운로드하는 컴퓨터를 감염시킬 수있는 바이러스가 포함 된 파일이 있지만 실제로는이 질문의 범위를 벗어나며 서버 자체에는 아무런 영향을 미치지 않습니다.
서버의 보안에 관심이 있으십니까? 아니면 고객의? 또는 (선호) 둘 다요? 실행 파일의 업로드/다운로드를 허용하면 수행 할 수있는 작업이 많지 않습니다 (확인, 어쩌면 바이러스 검색 프로그램). 그러나 예를 들어 스크립트? – VolkerK
누군가가 .php 스크립트를 업로드하고 서버가 손상 될까봐 걱정됩니다. 클라이언트가 정말로 바이러스를 다운로드하는지 상관하지 않습니다. –
download.php 스크립트가 직접 다운로드를 시작하는지 확인하십시오. 즉, 브라우저가 download.php_의 내용이 다운로드되는 파일의 내용과 정확히 일치해야한다는 것을 브라우저가 보는 방식입니다. 위에서 설명한 바와 같이 설명을하면, 어리석은 실수를 저 지르지 않는 한 괜찮을 것입니다. – Cam