• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Bilder schützen

djfabi

Mitglied
Hallo,
ich mache mir momentan Gendanken über die Sicherheit bei Bildern.
Also ich habe für meine User ein PHP und HTML Upload Script, das funktioniert ja auch alles.
Aber ist das immer sicher?
Gibt es etwas besonderes was zu beachten ist?
Ich erinnere mich noch an den Film The Social Network wo Mark Zuckerberg die Studentenverzeichnisse hackt.
Da heißt es:
>Dunster ist heftig.... [undso weiter]..
Und bekommt man Resultate dann sind sie nicht direkt mit den Bildern verlinkt, sondern mit einem PHP Script, welches einen weiterleitet.


So wie ist das gemeint?
Und wie gehe ich das an, wenn ich die Bilder Pfade in einer MySQL Datenbank abspeichere und mit PHP auslese?

Ich hoffe ihr helft mir ;)
 
Es gibt keine Scherheit für Bilder, sobald diese auf einer öffentlichen Seite angezeigt werden. Spätestens dann, wenn ich die Seite aufgerufen habe, liegt das Bild bei mir im Cache. Und einen Screenshot kannst du nicht verhindern.
 
Jeglicher Versuch, Bilder zu schützen, die öffentlich zu sehen sind, ist meiner Meinung nach sinnlos. Wenn jemand dran kommen will, dann schafft er das auch.
 
Also ich vermute mal, dass Du nicht die Bilder schützen willst, Du willst vermutlich den Server schützen, vor schädlichem Upload. Dazu musst Du den MIME-Typ auswerten, der im Array $_FILES mit angegeben ist. Allerdings ist zu beachten, dass auch der MIME-Typ gefaked sein kann, da das Informationen sind, die der Browser übergibt und nicht auf dem Server verifiziert wird. Um sicher zu gehen, dass es sich um eine Bilddatei handelt, kannst Du mit PHP: getimagesize - Manual prüfen.

P.S. Den Film habe ich nicht gesehen
 
Wenn Bilder auf dem Server liegen, ist es schwierig Einfluss darauf zu nehmen, wer darauf zugreifen darf und wer nicht. Das geht mit Einträgen in der htaccess-Datei aber mit einer normalern Benutzerverwaltung wüsste ich nicht wie das gehen soll (auch wenn ich meine, dass es geht). Du kannst angemeldeten Besuchern die Bilder anzeigen. Aber wenn die den Bild-Pfad kopieren und jemand anderem schicken, kommt der in der Regel auch an das Bild.
(Sehr kryptische Dateiennamen verhindern, dass jemand per Raten auf die Dateinamen der Bilder stößt.)
Eine Alternative wäre, die Bilder als Binär-Daten in eine Datenbank zu legen. Deine Bildpfade würden nicht mehr zu .jpg-Dateien führen, sondern zu einer .php-Datei (z.B. bildgenerator.php?image=123456). Diese findet raus, ob der, der gerade auf das Bild zugreifen will, das Bild sehen darf und dementsprechend zeigt sie ein Bild an oder nicht.
 
Wenn Bilder auf dem Server liegen, ist es schwierig Einfluss darauf zu nehmen, wer darauf zugreifen darf und wer nicht. Das geht mit Einträgen in der htaccess-Datei aber mit einer normalern Benutzerverwaltung wüsste ich nicht wie das gehen soll (auch wenn ich meine, dass es geht). Du kannst angemeldeten Besuchern die Bilder anzeigen. Aber wenn die den Bild-Pfad kopieren und jemand anderem schicken, kommt der in der Regel auch an das Bild.
(Sehr kryptische Dateiennamen verhindern, dass jemand per Raten auf die Dateinamen der Bilder stößt.)
Eine Alternative wäre, die Bilder als Binär-Daten in eine Datenbank zu legen. Deine Bildpfade würden nicht mehr zu .jpg-Dateien führen, sondern zu einer .php-Datei (z.B. bildgenerator.php?image=123456). Diese findet raus, ob der, der gerade auf das Bild zugreifen will, das Bild sehen darf und dementsprechend zeigt sie ein Bild an oder nicht.

Die Idee ist nicht schlecht, allerdings ist es gar nicht nötig, die Bilder direkt in der Datenbank zu speichern. Ein nicht aufrufbarer Ordner, der alle Bilder enthält und ein PHP-Script, dass die Bilder an den Browser zurückgibt, wenn man die Berechtigungen dazu hat, ist völlig ausreichend.

Nimm's mir nicht übel, aber du scheinst noch ein Anfänger zu sein. Ich rate dir an, dich erst mit Uploads auseinanderzusetzen, wenn du wirklich das Zeug dazu hast. Ein Upload-Script ist so ziemlich das potentiell gefährlichste Script, das man erstellen kann und die PHP-Doku geht kein bisschen auf die Sicherheit eines Uploads ein.
 
Ok, danke bodil für die Idee, die finde ich gut!
Aber wie genau bekomme ich das hin?
Sagen wir mal ich hab einen Ordner, uploads, da sind alle Upload Bilder drin, und ein script, z.B. bilder_view.php
Aber wie genau binde ich jetzt aus der index.php das Bild über bilder_view.php ein?
Und auch, das es dann so aussieht:
Code:
<img src="uploads/bilder_view.php?1234567" height="" width="" alt="" />


Wie genau gehe ich das vom Prinzip her an?
Danke für eure Antworten
 
Hallo,

ich klink mich mal mit ein.
Eine Alternative wäre, die Bilder als Binär-Daten in eine Datenbank zu legen. Deine Bildpfade würden nicht mehr zu .jpg-Dateien führen, sondern zu einer .php-Datei (z.B. bildgenerator.php?image=123456). Diese findet raus, ob der, der gerade auf das Bild zugreifen will, das Bild sehen darf und dementsprechend zeigt sie ein Bild an oder nicht.
Grundsätzlich haben bilder nicht in einer DB zu suchen, würde ich sagen.

Bilder schützen, vor was und wem ist ja die frage.

Bilder nur bestimmten leuten zur verfügung zu stellen geht am sichersten in dem
1. es eine art Login gibt, denn man muss ja erfahren der darf und der nicht
2. bilder ausserhalb vom root speichern oder per php dort hin kopieren
3. ein php datei erstellen wie oben "bilder_view.php" die halt prüft, jo der ist angemeldet und der darf
4. die Datei liefert das bild über head() aus
fertig

Cheffchen
 
Danke, erstmal, ich habe jetzt mal eben kurz angefangen das zu schreiben, undso sieht es bis jetzt aus:
(Die Funktionen sind aus der PHP Doku kopiert)
PHP:
<?php


include('connect.php');


function loadpng($imgname) {
    $im = @ImageCreateFromPNG ($imgname); /* Versuch, Datei zu öffnen */
    if (!$im) {                           /* Prüfen, ob fehlgeschlagen */
        $im = ImageCreate (150, 30);      /* Erzeugen eines leeren Bildes */
        $bgc = ImageColorAllocate ($im, 255, 255, 255);
        $tc  = ImageColorAllocate ($im, 0, 0, 0);
        ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc); 
        /* Ausgabe einer Fehlermeldung */
        ImageString($im, 1, 5, 5, "Fehler beim Öffnen von: $imgname", $tc); 
    }
    return $im;
}




function loadGif($imgname) {
    /* Versuch Datei zu öffnen */
    $im = @imagecreatefromgif($imgname);


    /* Wenn Öffnen fehlgeschlagen ist */
    if (!$im) {
        /* Erzeuge ein leeres Bild */
        $im  = imagecreatetruecolor(150, 30);
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);


        imagefilledrectangle($im, 0, 0, 150, 30, $bgc);


        /* Gebe eine Fehlermeldung im Bild aus */
        imagestring($im, 1, 5, 5, 'Fehler beim Öffnen von ' . $imgname, $tc);
    }


    return $im;
}




function loadjpeg ($imgname) {
    $im = @ImageCreateFromJPEG ($imgname); /* Versuch, Datei zu öffnen */
    if (!$im) {                            /* Prüfen, ob fehlgeschlagen */
        $im = ImageCreate (150, 30);       /* Erzeugen eines leeren Bildes */
        $bgc = ImageColorAllocate ($im, 255, 255, 255);
        $tc  = ImageColorAllocate ($im, 0, 0, 0);
        ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc); 
        /* Ausgabe einer Fehlermeldung */
        ImageString($im, 1, 5, 5, "Fehler beim Öffnen von: $imgname", $tc); 
    }
    return $im;
}








if(!isset($_GET['id']) || $_GET['id'] == ""){
    header("Location: http://www.domain.com/");
}else{
    $get = $_GET['id'];
    $mysql = mysql_query("SELECT * FROM db_fur_bilder WHERE bild_number = '".mysql_real_escape_string($get)."' LIMIT 1");
    $fetch = mysql_fetch_object($mysql);
    $pfad = htmlspecialchars($fetch->pfad);
    echo  $pfad;
    
    $array=pathinfo($pfad);
if(strtolower($array['extension'])=="gif"){
    loadGif($pfad);
}else if(strtolower($array['extension'])=="png"){
    loadpng($pfad);
    
}else if(strtolower($array['extension'])=="jpg"){
    loadjpeg($pfad);
}else{
    header("Location: http://www.domain.com/");
}
    
    
    
    
    
}




?>

So nun mein Problem:
Das Bild wird nicht angezeigt, ist ja auch glaube ich klar, weil garnichts angezeigt wird..
Es wird jeweils nur mit return $img; zurückgegeben.
Wie werte ich das jetzt aus?
 
Jetzt hast du schon Copy/Paste aus der Doku gemacht, dann solltest du aber auch genau hinsehen. Da steht nämlich z.B.
PHP:
header('Content-Type: image/gif');

$img = LoadGif('bogus.image');

imagegif($img);
imagedestroy($img);

Die header ("Location...") sind natürlich Quatsch, wenn es das Bild nicht gibt, willst du ja nicht auf eine andere Seite weiterleiten. Auch dein echo $pfad ist fatal, das macht dir das Bild kaputt.
 
Das hatte ich gemacht, in Falle dessen, das der User die Seite foto_view.php aufruft ohne eine $_GET Variable anzuhängen.
Das echo $pfad hatte ich gemacht, um den mysql_query zu testen :D

Ok, habe es jetzt so geändert das alles funktioniert, danke an euch alle die mir geholfen haben :)
 
Moin,
willst du die Bilder verändern bevor du sie anzeigst, ich dachte es geht nur darum sie zu schützen? Ansonsten kannst du dir das Imagecreate und Co nämlich sparen.


Mal vereinfacht:
PHP:
<?php
session_start();

if (isset($_GET['bild']) && file_exists($_GET['bild'])) 
{
  // Prüfen ob er das Bild sehen darf, z.b. mit sessions
  if (isset($_SESSION['jaIchDarfDasSehen']))
  { // Ich darf es sehen
     if ($size = getimagesize($_GET['bild'])) 
    { // Jo, is n Bild
       header("Content-type: {$size['mime']}");
       readfile($_GET['bild']);
    }
  } else {
     // Ich darf es nicht sehen, 404 schicken
    header("HTTP/1.0 404 Not Found");
    // oder alternativ ein anderes bild
    // header("Content-type: image/png");
    // readfile("dudasnichtsehenduerfen.png");
  }
}

MfG
 
Zurück
Oben