2011-09-16 5 views
0
내가 FLV 파일이

를 통해 파일을 스트리밍, 내가 PHP를 통해 스트리밍 싶습니다 기압 나는 다음과 같은 코드가 있습니다는 PHP

업데이트 된 코드를
이 내가 phihag에서 복사 한 코드입니다, 하지만 코드가 파일을 다운로드하지 못하면 반환하고 파일을 비 웁니다!

$file = $_GET['url'];
if ((substr($file, 0, 7) != 'http://') && (substr($file, 0, 8) != 'https://')) {
die('You have to specify an HTTP URL');
}
$f = fopen($file, "rb"); // b is required on Windows
if ($f !== false) {
header('Content-Description: File Transfer');
header('Content-Type: application/flv');
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();
$f = fopen($_GET['file'], "r");
while(!feof($f)) {
echo fread($f,8192);
}
fclose($f);
exit;
}

나던 작업 위의 코드는, 어떤 이유로 그것은 if 문을 전달받을 나던, 그리고 내가 ifstatement를 제거 할 때 그것은 빈 파일을 다운로드! 파일은 내가 액세스 할 수없는 원격 서버에 저장됩니다.

감사

답변

2

if (fopen($url, "r")) {은이 프로그램에 정의되지 않은 변수 $url을 사용합니다. 당신은 아마도 원할 것입니다 :

$file = $_GET['url']; 
// Security check to prevent users from echoing all the files on this server 
if ((substr($file, 0, 7) != 'http://') && (substr($file, 0, 8) != 'https://')) { 
    die('You have to specify an HTTP URL'); 
} 
$f = fopen($file, "rb"); // b is required on Windows 
if ($f !== false) { 
    header(...) 
    echo ... 
} 
+0

감사합니다. 그러나 지금은 파일을 다운로드하지 않았습니다. – ahoura

+1

@ahoura'fopen'은 전체 코드 발췌에서 한 번만 호출해야하며 후자를 제거해야합니다. 또한, 먼저 파일을 다운로드 할 수 있는지 확인하십시오. – phihag

+0

이봐, 내가 수동으로했기 때문에 나는 파일을 다운로드 할 수 있다고 확신하지만, 나는 당신이 의미하는 바를 이해하지 못한다. ... – ahoura

4

서버가 아마 configured to disallow fopen() on URLs입니다.

또한 개방형 프록시가 있으므로 보안 위험이 있습니다. 원하는 URL을 서버를 통해 전달하는 대신 요청한 URL의 유효성을 검사해야합니다. 더 나쁜 것은 로컬 파일을 $_GET['file']에 전달하고 PHP가 실행되는 사용자가 액세스 할 수있는 서버의 모든 파일을 추출 할 수 있다는 것입니다. 무서운 물건!