Interner Fehler, code 500

Hallo liebe bplaced-Nutzer und Mitarbeiter!

Ich schreibe dieses, Thema, weil ich seit heute einen komischen Fehler bekomme, wenn ich versuche, eine bestimmte PHP-Datei aufzurufen.

Fehler: (check .htaccess) Interner Fehler, code 500. Internal server error, code 500

Das PHP-Skript, das aufgerufen wird, liest eine Datei aus und sendet sie als Anhang zum Clienten zurück. Eine .htaccess-Datei ist überhaupt nicht vorhanden, deswegen wundere ich mich, warum dieser Fehler kommt. Über Google bin ich auch auf einige andere bplaced-Nutzer gestoßen, die den gleichen Fehler hatten, wo man allerdings damals keine Antwort gefunden hat. Falls jemand eine Idee hat, woran es liegen könnte, bitte melden.

Danke und schönen Abend, erics465

hi

nur eine bestimmte Datei, richtig?

Der Fehler kann sich auch darauf beziehen, dass das Script als solches “abkackt” und dann der Server nicht mehr weiter weiß, was zu tun wäre…und daher diesen Fehler ausgibt.

Um was für Vorgänge handelt es sich denn in dem Script?

ciao

Das Script ist variabel, es kann Parameter für die entsprechende Datei entgegen nehmen, also nicht nur bei einer, sondern bei allen im Verzeichnis.

Was mich wundert ist, dass ich in einem anderen Verzeichnis etwas ähnliches gemacht habe, das aber funktioniert.

Hier ist mal der entsprechende Quellcodeauszug:

	if (isset($_GET['file'])) {
		$dir = "userfiles/".$_SESSION['name']."/".$_GET['file'];
		if (file_exists($dir)) {
			header("Content-Type: "+mime_content_type($dir));
			header("Content-Disposition: attachment; filename=\"".$_GET['file']."\"");
			readfile($dir);
		} else {
			echo "Diese Datei existiert nicht.";
		}
	} else {
		echo "Es ist ein unerwarteter Fehler aufgetreten. Es wurde kein Parameter übergeben!";
		echo "<br>Bitte probieren Sie es später erneut!";
	}

Also wird die Datei, die per GET-Parameter übergeben wird, heruntergeladen. Das ganze ist natürlich gesichert, ich hab den entsprechenden Abschnitt nur nicht mitgepostet.

Hallo erics465,

Du benutzt zwar keine .htaccess-Datei, aber du veränderst den HTTP-Header. Bei den wenigen Zeilen hätte man auch ruhig immer ein wenig herausnehmen können, um zu sehen, wo der Fehler liegt.

Versuch mal:

header("Content-Type: ".mime_content_type($dir));
anstatt von

[quote=„erics465“] header("Content-Type: "+mime_content_type($dir)); [/quote]

Wenn du die Strings addierst, kommt 0 heraus und dann versuchst du den Header 0 zu setzen.

Liebe Grüße,
Jan

PS:
Nur mal so aus Neugier…

Wie hast du es denn noch gesichert?

Super, klappt! Danke, ich dachte bisher, das man Strings wie auch in anderen Programmiersprachen mit einem “+” verknüpfen kann, anscheinend funktioniert das in PHP nicht.

Wegen der Sicherheit:
Bevor man die entsprechende PHP-Datei aufrufen kann, muss man sich anmelden, wenn man nicht angemeldet ist, wird automatisch auf die Anmeldeseite weitergeleitet(Ich arbeite mit Sessions). Die Dateien sind nicht direkt verlinkt, sondern nur über die PHP-Seite abrufbar, man müsste also wenn schon den Dateipfad raten. Allerdings werde ich das Verzeichnis dann später noch mit einer htaccess schützen. Im Moment habe ich das allerdings rausgelassen, da das ganze noch in der Entwicklung ist.

Schöne Grüße und vielen Dank
erics465

Nicht „raten“ – Handbuch lesen!

Ja, riesengroßes Loch, selbst mit deiner Anmeldung und dem was du noch geplant hast;
Stichwort: Path Traversal

Wegen den String-Verknüpfungen: Jetzt weiß ich es ja!

Wegen der Sicherheit: Hab mittlerweile die htaccess eingebaut. Vielen Dank für das Stichwort “Path Traversal”, werd mich mal damit beschäftigen und hoffentlich eine Lösung dagegen finden!

EDIT: Kleine Frage, funktioniert dieses Path Traversal auch wenn z.B. so ein Dateipfad aufgerufen wird: test/tes2/…/…/…/test.xyz ?

Ja, am besten ist du normalisierst den Pfad mit realpath

$basedir = realpath("userfiles"); //wird dir hier auf bplaced ~ "/users/erics465/www/userfiles" geben
$req_dir = realpath($basedir . "/". $_SESSION['name'] . "/" . $_GET['file']);

if(substr($req_dir, 0, strlen($basedir)) !== $basedir) {
  die("Böses ist im Busch!");
}

oder so…

Danke für die Antwort! Hatte mir auch schon Gedanken gemacht, aber auf diese Lösung bin ich noch nicht gekommen!