it-swarm.com.de

Ist es möglich, binäre Bilddaten in HTML-Markup zu setzen und das Bild dann wie gewohnt in einem beliebigen Browser anzuzeigen?

Dies ist eine wichtige Sicherheitsfrage und ich bin mir sicher, dass dies möglich sein sollte.

Ein einfaches Beispiel:

Sie betreiben ein Community-Portal. Benutzer sind registriert und laden ihre Bilder hoch. Ihre Anwendung gibt Sicherheitsregeln vor, wenn ein Bild angezeigt werden darf. Zum Beispiel müssen Benutzer auf jeder Seite Freunde des Systems sein, damit Sie die hochgeladenen Bilder einer anderen Person anzeigen können.

Hier kommt das Problem: Es ist möglich, dass jemand die Image-Verzeichnisse Ihres Servers durchsucht. Sie möchten Ihre Benutzer jedoch vor solchen Angriffen schützen.

Wenn Sie die binären Daten eines Bildes direkt in das HTML-Markup einfügen können, können Sie den Benutzerzugriff auf Ihre Bildverzeichnisse auf den Benutzer beschränken und Ihre Webanwendungsgruppen gruppieren und die Bilddaten direkt an Ihren Apache-Benutzer und an Ihre Gruppe übergeben das HTML.

Die einzig mögliche Schwäche ist das Passwort des Benutzers, unter dem Ihre Web-App ausgeführt wird.

Gibt es schon eine Möglichkeit?

43
Joern Akkermann

Es gibt andere (bessere) Möglichkeiten, um Ihre Dateien zu schützen, aber ja, es ist möglich, das Bild in Ihre HTML einzubetten.

Verwenden Sie das <img>-Tag folgendermaßen:

<img src="data:image/gif;base64,xxxxxxxxxxxxx...">

Dabei ist der xxxxx...-Teil eine base64-Kodierung von GIF-Bilddaten.

77
bmb

Wenn ich Sicherheit für mein Bilderverzeichnis benötige, würde ich das Verzeichnis überhaupt nicht verfügbar machen. Stattdessen verweisen meine Attribute img src auf eine Seite, die eine Benutzer-ID und eine Bild-ID als Parameter verwendet.

Die Seite würde bestätigen, dass der Benutzer tatsächlich Zugriff auf dieses Bild hat. Wenn alles gut ist, senden Sie die Binärdatei zurück. Sonst nichts senden.

zum Beispiel:

<img src="imgaccess.php?userid=1111&imgid=223423" />

Ich würde auch keine erratenen Ids verwenden. Stattdessen bleibst du bei so etwas wie 64 kodierten Hilfslinien. 

11
NotMe

Ich bin mir nicht sicher, ob ich es verstehe, aber hier geht es. Statt statische Bilder bereitzustellen, die sich in einem Bilderordner befinden - warum können Sie die Bilder nicht mithilfe Ihrer bevorzugten serverseitigen Technologie dynamisch an den Client senden? Auf diese Weise kann Ihr serverseitiger Code in den Mix eingreifen und den Zugriff programmgesteuert zulassen oder verweigern.

<img src="/images/getImage.aspx?id=123353 />
3
Eric

Sie können die Bilder aus dem Dokumentstamm in ein privates Verzeichnis verschieben und über Ihre Anwendung bereitstellen, die Zugriff auf dieses Verzeichnis hat. Jedes Mal, wenn Ihre App ein Image-Tag generiert, generiert sie außerdem ein kurzlebiges Sicherheitstoken, das beim Zugriff auf ein bestimmtes Image angegeben werden muss:

<img src="/app/getImage.xyz?image=12345&token=12a342e32b321" />

Es ist sehr selten möglich, dass jemand das richtige Token mit dem richtigen Image zur richtigen Zeit erzwingt. Es gibt zumindest Möglichkeiten, das Token in "getImage" zu überprüfen:

  1. Verfolgen Sie alle Bild-Tags in Ihrer App und speichern Sie Datensätze in einer Datenbank, die die zufällig generierten Token und Bild-IDs mit den anfragenden Benutzern verknüpfen. Die Aktion "getImage" überprüft dann die angegebenen Parameter anhand dieser Datenbank.
  2. Generieren Sie das Token als Prüfsumme (MD5, CRC, was auch immer) über die Benutzer-ID, die Image-ID und möglicherweise den aktuellen Tag des Jahres, und stellen Sie sicher, dass Sie ein nicht erlernbares Salz dazugeben. Die Aktion "getImage" berechnet dann die Prüfsumme neu und vergleicht sie mit der angegebenen, um den Zugriff des Benutzers zu überprüfen. Diese Methode verursacht weniger Aufwand als die erste.

PHP-Beispiel:

$token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));
1
the-banana-king

Mit HTML5 können Sie dazu das Canvas-Tag und JavaScript verwenden. 

Sie könnten vielleicht etwas mit CSS oder einem Tabellenlayout machen, um ein Bild zu zeichnen (wahrscheinlich sehr schlechte Leistung, Auflösung, Portabilität).

So oder so, es gibt keine Leute, die Ihre Fotos machen. Sie könnten einen Screenshot machen und ihn herausschneiden.

Wie Chris in seiner Antwort erwähnte, ist es wichtig, lange Bild-IDs zu haben, so dass die URL für jedes Bild nicht leicht zu erraten oder rohe Gewalt ist. Es gibt auch keine Verzeichnisliste in Ihren Webserver-Verzeichnissen.

0