Regina Schaukrug: Aufrufschutz mit .htaccess und PHP

Beitrag lesen

RewriteEngine on
RewriteRule (.*)\.pdf$ https://pfad_zur_pruefdatei.php?dt=$1`

Die PHP-Datei sind (gekürzt) so aus:

<?php
session_start();
if(is_numeric($_SESSION['uid']) && $_SESSION['uid']>0) { # Benutzer eingeloggt
	$uid = $_SESSION['uid'];
	if(isset($_GET['dt']) && $_GET['dt']!='') { # Aufruf via Direkturl auf die PDF (alte Links)
 		$datei = $_GET['dt'];
 	  header('Content-Type: application/pdf');
 		readfile("absoluter_pfad_zur_pdf/".$datei);  
 	}
} else { # Kein aktiver Login
	header("Location:loginseite.php");
}
?>

Mein Problem ist nun, das die PHP angesprochen wird, aber die PDF eine 0-byte-Datei ist, d.h. keine Ausgabe.

Vermutlich ist an readfile("absoluter_pfad_zur_pdf/".$datei); etwas falsch. Da es der Befehl nicht ist, bleibt der Parameter. Es kann aber ebenso sein, dass der Webserver die Datei nicht lesen darf. (chmod 644 <DATEI> oder chmod a+r <DATEI>) könnte helfen. Das Verzeichnis mit dem PDF muss vom Webserver betreten und gelesen werden können. (chmod 755 <DIR> oder chmod a+rw <DIR>)

Das Error-Log sollte Dir mehr sagen. Ebenso kannst Du das Error-Reporting anschalten:

error_reporting(E_ALL);
ini_set("display_errors", 1);

und mit den Entwicklertools Deines Browsers den Quelltext der Antwort ansehen.

Warnungen:

1.)

Außerdem solltest Du auf das ?> am Ende verzichten, weil sonst womöglich nicht nur "hyperliquide" sondern unwillkommene Leerzeichen und Zeilenumbrüche gesendet werden. Wie die verschiedenen "PDF-Anzeiger" damit umgehen ist unklar, das kann zu Fehlermeldungen statt zur Anzeige führen.

2.)

Ich sehe nichts, was verhindert, das ggf. Dateien abgeholt werden, die in anderen als dem gewünschtem Verzeichnis liegen. Das ist gefährlich!

Hinweise:

Ich würde noch folgende Header senden:

header( 'Content-Disposition: attachment; filename=' . $filename ); 
header( 'Content-Transfer-Encoding: binary' ); 
header( 'Content-Length: ' . filesize( $file ) );