kostenloser Webspace werbefrei: lima-city


.htaccess Sicherung - User: No Access, Server: Access

lima-cityForumDie eigene HomepageSicherheit im Internet

  1. k**********k

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!