2010-06-20 10 views
4

나는 플래시 플레이어를 사용하여 일부 MP3 파일을 재생하고 있습니다. 파이어 폭스에서 정상적으로로드되지만 IE에서는로드되지 않습니다. mp3 파일의 URL로 이동하면 mp3의 소스 코드가 표시됩니다 (예 : 다운로드하는 대신 제공). 그래서 작은 스크립트를 사용하여 수정했습니다 :PHP는 읽기 파일 - 강제 다운로드

$url = $_GET['url']; 
header('Content-type: application/force-download'); 
header('Content-Transfer-Encoding: Binary'); 
header("Content-disposition: attachment; filename=demo.mp3"); 
readfile($url); 

위의 사항이 안전한 지 물어보고 싶습니다. 게다가, 서버는 이런 방식으로 대역폭을 손실합니까? 마지막으로 서버의 리소스에 영향을 줍니까? 감사합니다. .

답변

9

아니요, 안전하지 않습니다. database.php에 데이터베이스 비밀번호가 있고 database.php$_GET['url']으로 입력하면 스크립트에서 암호와 함께 PHP 파일을 보내 게됩니다.

예, 대역폭 및 일부 서버 리소스를 사용합니다.

+0

흠 다음. 좋아. 고마워! – Manolis

5

안전하지 않으므로 그렇게하지 않아도됩니다.

@ceejayoz 외양에 대한 보안 외에도 allow_url_fopen PHP 설정을 사용하는 경우 $url에 URL을 삽입 할 수도 있습니다. 그렇게하면 서버가 쉽게 다른 서버에서 많은 양의 데이터를 스트리밍하기 위해 오용 될 수 있습니다.

이 파일 제공 방법은 실제로 필요한 경우에만 사용해야합니다. 웹 서버를 통해 정적 자원을 요청하는 것보다 많은 자원을 소비합니다 (비싼 PHP 프로세스가 시작되어야하기 때문에).

어쨌든 귀하의 경우에는 필요하지 않습니다. 웹 서버가 MP3 파일과 함께 올바른 content-type 헤더를 제공하지 않는 것 같습니다. 그것이 당신이 고쳐야 할 것입니다.

아마, 당신은 MP3 파일은 다음과 같은 내용에있는 디렉토리에 .htaccess 파일을 추가, 아파치에 있다면 :

AddType audio/mpeg .mp3 

이미 문제를 해결합니다. 그렇지 않은,하지만 force-download 일이 제대로되면,

AddType application/force-download .mp3 
2

귀하의 실제 문제는 당신이 MP3 파일을 제공 할 때 클라이언트에 콘텐츠 형식 헤더를 전송하지 않는 것입니다보십시오. mp3 파일의 내용을 보내기 전에 content-type 헤더를 설정해야합니다.

스크립트없이 웹 서버에서 직접 서비스하는 경우 웹 서버 구성에서 콘텐츠 유형을 구성하기 만하면됩니다.

아파치를 들어, 당신은 htaccess로 파일에이를 구성 할 수 있습니다 : 당신이 요청 된 파일 경로를 살균/검증되지 않기 때문에

AddType audio/mpeg .mp3 
1

그래 여기 확실히 보안 위험이 있습니다. 따라서 사용자에게 파일을 보내기 전에 확인하십시오!

대역폭과 서버 리소스를 사용하지만 정기적으로 파일을 다운로드하는 것 이상의 의미가 있습니다. 유일한 추가 오버 헤드는 PHP 처리/실행입니다. 아마도 차이점을 느끼지 못할 것입니다.