Est-il possible de mettre les données d'image binaire dans le balisage html et ensuite obtenir l'image affichée comme d'habitude dans n'importe quel navigateur?

C'est un problème de sécurité important et je suis sûr que cela devrait être possible.

Un exemple simple:

vous dirigez un portail communautaire. Les utilisateurs sont enregistrés et télécharger leurs photos. Votre application donne des règles de sécurité chaque fois qu'une image est autorisée à être affichée. Par exemple, les utilisateurs doivent être des amis de chaque côté du système, afin que vous puissiez voir les photos téléchargées par quelqu'un d'autre.

Voici le problème: il est possible que quelqu'un analyse le image répertoires de votre serveur. Mais vous voulez protéger vos utilisateurs contre de telles attaques.

S'il est possible de placer les données binaires d'une image directement dans le markup HTML, vous pouvez restreindre l'accès utilisateur de vos dirs image à l'utilisateur et grouper les passages de votre application web et passer les données image à votre utilisateur Apache et grouper directement dans le HTML.

La seule faiblesse est alors le mot de passe de l'utilisateur de votre application web s'exécute.

Est-il déjà une possibilité?

41
demandé sur Joern Akkermann 2010-03-12 04:33:38

5 réponses

il y a d'autres (meilleures) façons, décrites dans d'autres réponses, de sécuriser vos fichiers, mais oui il est possible d'intégrer l'image dans votre html.

<img> balise comme ceci:

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

xxxxx... part est un encodage base64 des données d'image gif.

70
répondu bmb 2010-03-12 05:41:32

si j'avais besoin de sécurité sur mon répertoire images, Je ne l'exposerais pas du tout. Au lieu de cela, mes attributs img src feraient référence à une page qui prendrait un userid et un ID d'image comme paramètre.

la page validerait que cet utilisateur avait effectivement accès à cette image. Si tout va bien, renvoie le binaire. Sinon, envoyez rien.

par exemple:

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

de plus, je n'utiliserais pas de carte d'identité. Au lieu de s'en tenir à quelque chose comme la base 64 codée par guid.

11
répondu NotMe 2010-03-12 01:38:19

je ne suis pas sûr de comprendre, mais voilà. Au lieu de servir des images statiques qui résident dans un dossier d'images - pourquoi ne pourriez-vous pas, en utilisant votre technologie de choix côté serveur, avoir les images envoyées dynamiquement vers le bas au client? De cette façon, votre code côté serveur peut entrer dans le mix et autoriser ou refuser l'accès par programmation?

<img src="/images/getImage.aspx?id=123353 />
3
répondu Eric 2010-03-12 01:40:00

avec HTML5 vous pouvez utiliser la balise canvas et JavaScript pour le faire.

vous pourriez peut-être faire quelque chose avec CSS ou une mise en page de table pour dessiner une image (probablement très mauvaise performance, résolution, portabilité).

dans les deux cas, rien n'empêche les gens de prendre vos photos. Ils pourraient prendre une capture d'écran et de la culture.

comme Chris l'a mentionné dans sa réponse, avoir de longues id d'image de sorte que l'URL de chaque image n'est pas facile à deviner ou la force brute est importante. Et aucune liste de répertoire sur vos répertoires webserver ne l'est aussi.

0
répondu Sean A.O. Harney 2010-03-12 01:43:45

vous pouvez déplacer les images de la racine du document dans un répertoire privé et les livrer à travers votre application, qui a accès à ce répertoire. Chaque fois que votre application génère une balise image, elle génère également un token de sécurité de courte durée qui doit être spécifié lors de l'accès à une image particulière:

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

les Chances sont très rares que quelqu'un force le bon jeton au bon moment avec la bonne image. Il y a au moins des possibilités de vérifier le jeton dans "getImage":

  1. Suivi de toutes les balises d'image dans votre application et de stocker les enregistrements dans une base de données dont le lien généré de façon aléatoire, des jetons et de l'image de l'IDs à la demande des utilisateurs. L'action" getImage " vérifie ensuite les paramètres fournis par rapport à cette base de données.
  2. générez le jeton comme un checksum (MD5, CRC, n'importe quoi) sur l'identifiant de l'utilisateur, L'identifiant de l'image et peut-être le jour courant de l'année, et assurez-vous de mélanger un sel inguessable. L'action" getImage" recalculer la somme de contrôle et la vérifier par rapport à celle spécifiée afin de vérifier l'accès de l'utilisateur. Cette méthode produira moins de frais généraux que la première.

PHP exemple:

$token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));
0
répondu the-banana-king 2010-03-12 02:02:31