ok. ich hab da drei fragen...
[#1]
[fp]preg_match("/^[0-9A-Za-z_-]+\\.jar$/", $_GET['file'], $matches)[/fp]
is das sicher? also es soll nur "*.jar" files erlauben (0-9, A-Z, a-z, '_', '-' und am ende ".jar").
[#2]
gegen ende hab ich da ne schleife, die den inhalt von na file zurückbounced. is das ok so mit der schleife oder sollte man fpassthu benutzen? ich hab die doku+kommentare von beiden sachen gelesen und bin nicht wirklich schlauer geworden (n paar meinten halt fpassthu frisst viel ram bei grossen files) :>
[#3]
irgendwo stand das man drauf achten sollte, das das lesen wirklich übers filesystem geht und nicht über http... wie stellt man das sicher?
Code: Alles auswählen
<?[br]if(!isset($_GET['file'[b][/b]][b][/b])[b][/b])[br]{[br] not_found([b][/b]);[br]}[br][br]if (preg_match("/^[0-9A-Za-z_-[b][/b]]+\\.jar$/", $_GET['file'[b][/b]], $matches[b][/b])[b][/b])[br]{[br] $gzip_accepted=FALSE;[br] $pack_accepted=FALSE;[br][br] if(strpos($_SERVER['HTTP_ACCEPT_ENCODING'[b][/b]], "pack200-gzip"[b][/b])!==FALSE[b][/b])[br] $pack_accepted=TRUE;[br] if(strpos($_SERVER['HTTP_ACCEPT_ENCODING'[b][/b]], "gzip"[b][/b])!==FALSE[b][/b])[br] $gzip_accepted=TRUE;[br][br] if(is_file($matches[0[b][/b]].".pack.gz"[b][/b]) AND $pack_accepted[b][/b])[br] {[br] send_and_die($matches[0[b][/b]].".pack.gz","pack200-gzip"[b][/b]);[br] }[br] elseif(is_file($matches[0[b][/b]].".gz"[b][/b]) AND $gzip_accepted[b][/b])[br] {[br] send_and_die($matches[0[b][/b]].".gz","gzip"[b][/b]);[br] }[br] elseif(is_file($matches[0[b][/b]][b][/b])[b][/b])[br] {[br] send_and_die($matches[0[b][/b]],NULL[b][/b]);[br] }[br] else[br] {[br] not_found([b][/b]);[br] }[br]}[br]else[br]{[br] not_found([b][/b]);[br]}[br][br]function send_and_die($filename,$enc[b][/b])[br]{[br] $status = FALSE;[br] $etag = filectime($filename[b][/b]).filesize($filename[b][/b]);[br] $headers = getallheaders([b][/b]);[br] if (ereg($etag, $headers['If-None-Match'[b][/b]][b][/b])[b][/b])[br] {[br] header('HTTP/1.1 304 Not Modified'[b][/b]);[br] }[br] else[br] {[br] if(($fp = fopen($filename, 'rb'[b][/b])[b][/b])==FALSE[b][/b])[br] not_found([b][/b]);[br] header("Content-Type: application/x-java-archive"[b][/b]); //this content type can be used for all versions[br] if($enc!=NULL[b][/b])[br] header("Content-Encoding: ".$enc[b][/b]);[br] header("Content-Length: " . filesize($filename[b][/b])[b][/b]);[br] header("ETag: \"{$etag}\""[b][/b]);[br] header('Last-Modified: '.gmdate('D, d M Y H:i:s \G\M\T', filemtime($filename[b][/b])[b][/b])[b][/b]);[br] header("Connection: close"[b][/b]);[br][br] while(!feof($fp[b][/b]) AND (connection_status([b][/b])==0[b][/b])[b][/b])[br] {[br] print fread($fp, 8192[b][/b]);[br] flush([b][/b]);[br] }[br] $status = (connection_status([b][/b])==0[b][/b]);[br] fclose($fp[b][/b]);[br] }[br] //save the status here if you like[br] die([b][/b]);[br]}[br][br]function not_found([b][/b])[br]{[br] //you could do something else here, like logging and/or bouncing it back to your usual 404 page[br] header("Status: 404 Not Found"[b][/b]);[br] die([b][/b]);[br]}[br]?>