.htaccess Sicherung - User: No Access, Server: Access
lima-city → Forum → Die eigene Homepage → Sicherheit im Internet
ausgeben
bild
bildformat
code
datei
ende
erstellen
fehlermeldung
foto
gefunden bild
header
http
index
mime
ordner
show
type
url
verzeichnis
zugriff
-
Also ich hab die beiden Datein jetzt mal zusammengesetzt. Der Code lautet jetzt:
<?php // Aenderungen by ketchupfleck session_start(); // Aenderungen Ende // Nachfolgende Funktion ist fuer die Ausgabe eventueller Fehler als Bild zustaendig function error_message($text = ''){ header('Content-type: image/png'); $img = imagecreatetruecolor(strlen($text) * 7, 20); // Erstellt ein neues Bild imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255)); // Malt das bild weiss aus imagestring($img, 2, 0, 0, $text, imagecolorallocate($img, 0, 0, 0)); // Schreibt den Text der der Funktion Uebergeben wurde auf das Bild imagepng($img); // Gibt das Bild aus imagedestroy($img); // Loescht das Bild aus dem Arbeitsspeicher des Servers } // Aenderungen by ketchupfleck if($_SESSION['eingeloggt']){ $img_src_prefix="http://ketchupfleck.lima-city.de/sincer/asdfghjkl0asdfghjkl/"; // Der prefix dient dazu die Bilder in der Ordnerstruktur zu verstecken. $img_src = $img_src_prefix.$_GET['src']; // Pfad zum Bild aus welchem das Thumbnail erstellt werden soll // Aenderungen Ende $cache_dir = './cache'; // Pfad zum Cache Verzeichnis wo spaeter die Bilder gespeichert werden $cache = true; // Gibt an ob die Bilder aus dem Cache geladen werden sollen # Ueberprueft ob ein Bildpfad uebergeben wurde if (!isset($_GET['src'])){ error_message('Es wurde kein Bildpfad übergeben.'); // Gibt eine Fehlermeldung aus } # Auslesen der Bildgroesse und des Bildtyps $image_infos = @getimagesize($img_src) or error_message('Auf das Bild kann nicht zugegriffen werden'); $width = $image_infos[0]; $height = $image_infos[1]; $type = $image_infos[2]; $mime = $image_infos['mime']; // Aenderungen by ketchupfleck $show_thumbnail = True; // Wir gehen erstmal davon aus, dass ein Thumbnail verlangt wird // Aenderungen Ende # Berechnung der Masse des Thumbnails if (isset($_GET['p']) && !isset($_GET['w']) && !isset($_GET['h'])){ // Ãberprüfen ob die BildgröÃe proportional berechnet werden soll if($width < $height) { // Ueberpruefen ob das Bild Hoch- oder Querformat ist $new_width = ceil(($_GET['p'] / $height) * $width); $new_height = intval($_GET['p']); // Zuweisen der neuen Hoehe } else { $new_height = ceil(($_GET['p'] / $width) * $height); $new_width = intval($_GET['p']); // Zuweisen der neuen Breite } } else if (isset($_GET['w']) && !isset($_GET['h']) && !isset($_GET['p'])){ // Ueberpruefen ob die Breite oder die Hoehe berechnent werden soll $new_width = intval($_GET['w']); // Zuweisen der neuen Breite $new_height = ceil($height * $new_width / $width); // Berechnen der neuen Hoehe } else if (isset($_GET['h']) && !isset($_GET['w']) && !isset($_GET['p'])){ // Ueberpruefen ob die Breite oder die Hoehe berechnent werden soll $new_height = intval($_GET['h']); // Zuweisen der neuen Hoehe $new_width = ceil($width * $new_height / $height); // Berechnen der neuen Breite } else if (isset($_GET['h']) && isset($_GET['w']) && isset($_GET['p'])){ $new_height = intval($_GET['h']); // Zuweisen der neuen Hoehe $new_width = intval($_GET['w']); // Zuweisen der neuen Breite // Aenderungen by ketchupfleck } else if (!isset($_GET['h']) && !isset($_GET['w']) && !isset($_GET['p'])){ // Kein Parameter wurde gesetzt: Wir wollen kein Thumbnail! $show_thumbnail = False; // Aenderungen Ende } else { error_message('Es muss entweder die neu Höhe oder die neu Breite angegeben werden.'); // Fehlermeldung ausgeben } # Prüft ob das Chache Verzeichnis existiert bzw. benoetigt wird und legt dieses eventuell an if ($cache === true && !file_exists($cache_dir)){ mkdir($cache_dir) or error_message('Das Cache Verzeichnis konnte nicht angelegt werden'); // Legt das Cache Verzeichnis an. Sollte dies nicht moeglich sein, so wird ein Fehler ausgegeben chmod($cache_dir, 0777); // Gibt dem Cache Verzeichniss die noetigen Schreib- und Lese Rechte } # Ermitteln des Bildtypes und eventuelle Erstellung des Thumbnails switch ($type){ case 1: header('Content-type: image/gif'); // Header ausgeben if (imagetypes() & IMG_GIF){ // Ueberpruefen ob das Bildformat untestuetzt wird // Aenderungen by ketchupfleck if ($show_thumbnail){ // Aenderungen Ende if (!file_exists($cache_dir.'/'.md5($img_src).'.gif')){ // Wenn das Thumbnail nicht existiert wird es erstellt $orginal = imagecreatefromgif($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginalbild erstellen $thumb = imagecreatetruecolor($new_width, $new_height); // Das Thumbnailbild erstellen imagecopyresampled($thumb, $orginal, 0, 0, 0, 0, $new_width, $new_height, $width, $height); if ($cache === true){ // Prueft ob das Bild gespeichert werden soll imagegif($thumb, $cache_dir.'/'.md5($img_src).'.gif') or error_message('Das Bild konnte nicht gespeichert werden'); // Bild speichern } imagegif($thumb); // Bild ausgeben } else { readfile($cache_dir.'/'.md5($img_src).'.gif') or error_message('Das Bild wurde nicht gefunden'); // Bild ausgeben } // Aenderungen by ketchupfleck } else { $orginal = imagecreatefromgif($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginalbild erstellen imagegif($orginal); // Bild sicher anzeigen. } // Aenderungen Ende } else { error_message('GIF Bilder werden nicht unterstützt'); // Fehlermeldung ausgeben, wenn das Bildformat nicht unterstuetzt wird } break; case 2: header('Content-type: image/jpg'); // Header ausgeben if (imagetypes() & IMG_JPG){ // Ueberpruefen ob das Bildformat untestuetzt wird // Aenderungen by ketchupfleck if ($show_thumbnail){ // Aenderungen Ende if (!file_exists($cache_dir.'/'.md5($img_src).'.jpg')){ // Wenn das Thumbnail nicht existiert wird es erstellt $orginal = imagecreatefromjpeg($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginabild erstellen $thumb = imagecreatetruecolor($new_width, $new_height); // Das Thumbnailbild erstellen imagecopyresampled($thumb, $orginal, 0, 0, 0, 0, $new_width, $new_height, $width, $height); if ($cache === true){ // Prueft ob das Bild gespeichert werden soll imagejpeg($thumb, $cache_dir.'/'.md5($img_src).'.jpg') or error_message('Das Bild konnte nicht gespeichert werden'); // Bild speichern } imagejpeg($thumb); // Bild ausgeben } else { readfile($cache_dir.'/'.md5($img_src).'.jpg') or error_message('Das Bild wurde nicht gefunden'); // Bild ausgeben } // Aenderungen by ketchupfleck } else { $orginal = imagecreatefromjpeg($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginalbild erstellen imagejpeg($orginal); // Bild sicher anzeigen. } // Aenderungen Ende } else { error_message('JPEG Bilder werden nicht unterstützt'); // Fehlermeldung ausgeben, wenn das Bildformat nicht unterstützt wird } break; case 3: header('Content-type: image/png'); // Header ausgeben if (imagetypes() & IMG_PNG){ // Ueberpruefen ob das Bildformat untestuetzt wird // Aenderungen by ketchupfleck if ($show_thumbnail){ // Aenderungen Ende if (!file_exists($cache_dir.'/'.md5($img_src).'.png')){ // Wenn das Thumbnail nicht existiert wird es erstellt $orginal = imageCreateFromPNG($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginalbild erstellen $thumb = imagecreatetruecolor($new_width, $new_height); // Das Thumbnailbild erstellen imagecopyresampled($thumb, $orginal, 0, 0, 0, 0, $new_width, $new_height, $width, $height); if ($cache === true){ // Prueft ob das Bild gespeichert werden soll imagepng($thumb, $cache_dir.'/'.md5($img_src).'.png') or error_message('Das Bild konnte nicht gespeichert werden'); // Bild speichern } imagepng($thumb); // Bild ausgeben } else { readfile($cache_dir.'/'.md5($img_src).'.png') or error_message('Das Bild konnte nicht gespeichert werden'); // Bild ausgeben } // Aenderungen by ketchupfleck } else { $orginal = imageCreateFromPNG($img_src) or error_message('Das Bild wurde nicht gefunden'); // Bild aus dem Orginalbild erstellen imagepng($orginal); // Bild sicher anzeigen. } // Aenderungen Ende } else { error_message('PNG Bilder werden nicht unterstützt'); // Fehlermeldung ausgeben, wenn das Bildformat nicht unterstützt wird } break; default: error_message('Das Bildformat wird nicht unterstützt'); // Fehlermeldung ausgeben, wenn das Bildformat nicht unterstützt wird } # Loescht das Bild aus dem Speicher des Servers falls es existiert if (isset($thumb)){ imagedestroy($thumb); } // Aenderungen by ketchupfleck if (isset($orginal)){ @imagedestroy($orginal); } } else{ error_message("Sie haben nicht die noetigen Rechte um das Bild zu sehen"); } // Aenderungen Ende ?>
Alles was ich geändert habe, habe ich markiert. Ein Beispiel habe ich auch für dich: http://ketchupfleck.lima-city.de/sincer/beispiel.php. Die beispiel.php setzt übrigends die Berechtigung. Wenn du also Testen willst, ob das Berechtigungssystem funktioniert, rufst du z.B. http://ketchupfleck.lima-city.de/sincer/show2.php?src=archketchup.png mit einem anderen Browser/PC auf (oder du wartest bis die Session ausgelaufen ist).
Zur Erklärung:
Ich frage im Prinzip nur ab ob $_SESSION["eingeloggt"] True ist. Wenn deine Variable anderst heisst, musst du diese Zeile halt ändern. Wenn sie die Variable False ist bringe ich eine Fehlermeldung da der Benutzer dann nicht die nötigen Rechte hat. Danach schaue ich ob die Variable $_GET["p"] gesetzt ist. wenn sie das nicht ist gehe ich davon aus, dass du das Bild als Vollbild angezeigt haben möchtest und setze die Variable $show_thumbnail auf false. In der switch-Schleife frage ich dann nach $show_thumbnail und gebe jenachdem das Bild aus oder erstelle das Thumbnail.
Noch 3 Hinweise:
Wie gesagt frage ich in Zeile 25 nach $_SESSION["eingeloggt"]. Wenn deine $_SESSION-Variable anderst heisst, muss du ja nur diese Zeile ändern.
Desweiteren habe ich eine Variable namens $img_src_prefix in Zeile 16 festgelegt. Diese solltest du benutzen um deinen Grundpfad für Bilder anzugeben. D.h. wenn sich alle deine Bilder z.B. in http://example.com/asdfghjklk0asdfghjkl/ befinden gibst du das in dieser Variable an. Dann übermittelst du der PHP-Datei nurnoch den Dateinamen des Bildes. Dazu mal 2 Szenarios die das vielleicht etwas erklären.
Szenario 1:
Du möchtest das Bild mit dem Pfad http://example.com/asdfghjklk0asdfghjkl/bild1.png über die PHP-Datei show.php anzeigen. Dazu definierst du den Pfad "http://example.com/asdfghjklk0asdfghjkl/" in der Variable $img_src_prefix. Dann baust du folgenden IMG-Tag auf deiner Seite ein: <img src="show.php?src=bild1.png" />. Somit weiß niemand den Ordner wo die Bilder wirklich dirn stecken.
Szenario 2:
Du hast in dem Ordner http://example.com/asdfghjklk0asdfghjkl/ ein paar Bilder. Du hast aber zusätzlich in diesem Ordner noch einen Unterordner namens Avatare/. Im Grunde genommen machst du fast genau das selbe wie in Szenario 1: Du definierst zuerst den Pfad "http://example.com/asdfghjklk0asdfghjkl/" in der Variable $img_src_prefix in der PHP-Datei show.php. Wenn du nun auf ein Bild in dem Unterordner zugreifen willst, erstellst du einfach folgenden IMG-Tag: <img src="show.php?src=Avatare/bild1.png" />. Ist also nicht kompliziert.
Drittens: Das Script gibt, wie schon weiter oben beschrieben, jenachdem ob du p übergibst entweder das Vollbild oder ein Thumbnail aus. Ein Thumbnail verlinkst du also mit show.php?src=bild1&p=150. Ein Vollbild verlinkst du mit show.php?src=bild1.
lg Ketchup
€dit: @thomasba:
$file = "bilder/".str_replace("../","",$_GET["bild"]);
erstens wird hier immer das Verzeichniss bilder verwendet und zweitens wird ein betreten der Übergeordneten Verzeichnisse verhindert.
Ich sehe da keine Möglichkeit, andere dateien als die im Ordner Bilder auszulesen
Bist du dir da ganz sicher? Wie lange braucht ein Cracker um den "Filter" durch ausprobieren zu verstehen? 5 Minuten vielleicht. Und wenn er ihn verstanden hat, dann kann er ohne Probleme ..././ anstatt ../ nutzen, um in übergeordnete Verzeichnisse zu gelangen, denn der mittlere Teil wird ja entfernt und übrig bleibt ../
Beitrag zuletzt geändert: 29.9.2009 4:53:08 von ketchupfleck -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage