¿Es posible poner datos de imagen binarios en el marcado html y luego obtener la imagen mostrada como de costumbre en cualquier navegador?


Es un problema de seguridad importante y estoy seguro de que esto debería ser posible.

Un ejemplo sencillo:

Se ejecuta un portal de la comunidad. Los usuarios se registran y suben sus fotos. Su aplicación proporciona reglas de seguridad cada vez que se permite mostrar una imagen. Por ejemplo, los usuarios deben ser amigos en cada lado del sistema, para que pueda ver las fotos subidas de otra persona.

Aquí viene el problema: es posible que alguien rastree los directorios de imágenes de su servidor. Pero desea proteger a sus usuarios de tales ataques.

Si es posible poner los datos binarios de una imagen directamente en el marcado HTML, puede restringir el acceso de usuario de sus dirs de imagen al usuario y agrupar las ejecuciones de su aplicación web y pasar los datos de imagen a su usuario y grupo Apache directamente en el HTML.

La única debilidad posible entonces es la contraseña del usuario que su aplicación web se ejecuta como.

¿Existe ya una posibilidad?

Author: Joern Akkermann, 2010-03-12

5 answers

Hay otras (mejores) formas, descritas en otras respuestas, para proteger sus archivos, pero sí es posible incrustar la imagen en su html.

Use la etiqueta <img> de esta manera:

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

Donde la parte xxxxx... es una codificación base64 de datos de imágenes gif.

 70
Author: bmb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-12 05:41:32

Si necesitara seguridad en mi directorio de imágenes no expondría el directorio en absoluto. En su lugar, mis atributos img src harían referencia a una página que tomaría un id de usuario y un id de imagen como parámetro.

La página validaría que ese usuario efectivamente tuvo acceso para ver esa imagen. Si todo va bien, devuelve el binario. De lo contrario no enviar nada.

Por ejemplo:

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

Además, no usaría identificaciones adivinables. En su lugar, me apegaría a algo como base 64 codificada guid.

 11
Author: NotMe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-12 01:38:19

No estoy seguro de entender, pero aquí va. En lugar de servir imágenes estáticas que residen en una carpeta de imágenes, ¿por qué no pudo, utilizando la tecnología del lado del servidor de su elección, enviar las imágenes dinámicamente al cliente? De esa manera su código del lado del servidor puede entrar en la mezcla y permitir o denegar el acceso mediante programación?

<img src="/images/getImage.aspx?id=123353 />
 3
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-12 01:40:00

Con HTML5 puede usar la etiqueta canvas y JavaScript para hacer esto.

Tal vez podría hacer algo con CSS o un diseño de tabla para dibujar una imagen (probablemente muy mal rendimiento, resolución, portabilidad).

De cualquier manera, no hay manera de detener a la gente de tomar sus fotos. Podrían tomar una captura de pantalla y recortarla.

Como Chris mencionó en su respuesta, tener identificaciones de imagen largas para que la URL de cada imagen no sea fácil de adivinar o la fuerza bruta es importante. Y ninguna lista de directorios en los directorios de su servidor web es también.

 0
Author: Sean A.O. Harney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-12 01:43:45

Puede mover las imágenes de la raíz del documento a un directorio privado y entregarlas a través de su aplicación, que tiene acceso a ese directorio. Cada vez que su aplicación genera una etiqueta de imagen, también genera un token de seguridad de corta duración que debe especificarse al acceder a una imagen en particular:

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

Las posibilidades son muy raras de que alguien fuerza brutalmente el token correcto en el momento correcto con la imagen correcta. Hay por lo menos a las posibilidades de verificar el token en "getImage":

  1. Realiza un seguimiento de todas las etiquetas de imagen en los registros de tu app y tienda en una base de datos que vincule los tokens generados aleatoriamente y los ID de imagen a los usuarios solicitantes. La acción "getImage" comprueba los parámetros suministrados con esa base de datos.
  2. Genere el token como suma de comprobación (MD5, CRC, lo que sea) sobre el ID de usuario, el ID de imagen y tal vez el día actual del año, y asegúrese de mezclar una sal imposible de adivinar. La acción "getImage" volverá a calcular la suma de comprobación y compáralo con el especificado para verificar el acceso del usuario. Este método producirá menos gastos generales que el primero.

Ejemplo de PHP:

$token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));
 0
Author: the-banana-king,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-12 02:02:31