security - ¿Cómo protegerse contra el acceso directo a las imágenes?
image hotlinking (8)
Me gustaría crear un sitio web con muchas imágenes. Pero me gustaría protegerme contra el acceso directo a las imágenes, por ejemplo, enlaces directos a imágenes sin visitar el sitio web.
¿Cuál es la forma preferida de hacer esto? ¿Y cuáles son las alternativas con Pros y contras?
Tengo algunas ideas (no sé si son posibles):
- Permisos de archivos
- Sesiones de PHP
- Nombres de archivos temporales o URL
- Redirección HTTP?
Tal vez esto no se practica en muchos sitios web? Por ejemplo, intenté acceder a una foto privada en Facebook sin haber iniciado sesión, pero aún así pude visitar la foto.
La plataforma probablemente sea una máquina Ubuntu con NginX y PHP.
Agregue un archivo .htacess
simple en la carpeta de su sitio con las líneas follwoing
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www/.your-domain/.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www/.your-domain/.com$ [NC]
RewriteRule .*/.(wav|swf|jpg|jpeg|gif|png|bmp|js|css)$ - [F,NC,L]
Nota: También agregué el archivo js
y css
, incluso si creo que es extraño encontrar a alguien que intente rasparlos.
Esto va a ser difícil de hacer. Para que los navegadores web de sus clientes puedan acceder a las imágenes, deben ser legibles. Los permisos de archivos no funcionarán porque deberá otorgar acceso al navegador. No podrá evitar que alguien los descargue y haga algo con ellos.
Si solo desea detener el enlace directo, si cambia los nombres de los archivos regularmente y actualiza sus páginas para reflejar esto, otras páginas tendrán sus enlaces rotos.
Puede usar un script PHP para recuperar las imágenes usando algo como:
<img src="mysite.com/getimage.php?id=001" />
y haga que el script PHP devuelva los datos de imagen solo después de confirmar que el dominio de HTTP_REFERER es el suyo.
Si tiene un sitio orientado a la cuenta, le sugiero que use las sesiones PHP como indicó y que el script PHP verifique la sesión antes de devolver los datos de la imagen.
Vincula el elemento img a un archivo php. Este archivo comprueba si el usuario tiene el permiso correcto, de ser así puede enviar una respuesta img.
<img src="url/LoadImg.php?id=1337" alt="" />
Aún así, alguien con el permiso puede descargar la imagen y proporcionarla a otras personas en otro lugar (espacio web / correo / lo que sea). Para que sea un poco más difícil robarlo, puedes desactivar el clic derecho sobre la imagen, pero aún así un usuario que sabe un poco sobre http no debería tener ningún problema para robarlo. Puede colocar una firma sobre la imagen (por ejemplo, el logotipo / nombre de su sitio web) para que las personas puedan ver que usted es la fuente. Esto se puede hacer con php también.
Si quieres ser divertido, puedes configurar otra imagen (el porno es excelente para esto: P) que se envía si el enlace proviene de otra página: P
Utilizo ambos métodos - comprobando user gent y referrer. Agente de usuario que verifico en .htaccess. Y referrer check en el archivo php. Puedes verlo en http://coloring-4kids.com
Aquí está mi código:
RewriteCond %{HTTP_REFERER} !^http(s)?://(www/.)?pinterest/.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www/.)?pinterest/.com$ [NC]
RewriteCond %{HTTP_USER_AGENT} !(Googlebot|bingbot|msnbot|yahoo-mmcrawler|YandexImages) [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-image [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-news [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-video [NC]
RewriteCond %{HTTP_USER_AGENT} !googlebot-mobile [NC]
RewriteCond %{HTTP_USER_AGENT} !mediapartners-google [NC]
RewriteCond %{HTTP_USER_AGENT} !mediapartners [NC]
# RewriteCond %{HTTP_USER_AGENT} !adsbot-google [NC]
RewriteCond %{HTTP_USER_AGENT} !bingbot [NC]
RewriteCond %{HTTP_USER_AGENT} !facebookexternalhit [NC]
RewriteCond %{HTTP_USER_AGENT} !baiduspider [NC]
RewriteCond %{HTTP_USER_AGENT} !yandex [NC]
RewriteCond %{HTTP_USER_AGENT} !sogou [NC]
RewriteCond %{HTTP_USER_AGENT} !twitterbot [NC]
RewriteCond %{HTTP_USER_AGENT} !pinterest [NC]
RewriteRule (^.*/.(gif)$) /watermark.php?src=$1 [L]
watermark.php
<?php
$test = getenv("HTTP_REFERER");
$proverka = substr($test, 0, 25);
header(''content-type: image/jpeg'');
$image = imagecreatefromgif($_GET[''src'']);
$watermark = imagecreatefromgif(''watermark.gif'');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$dest_x = imagesx($image) - $watermark_width;
$dest_y = imagesy($image) - $watermark_height;
if (strpos($proverka, ''media'') !== false)
{ $pinproverka=true; }
if (($proverka != ''http://coloring-4kids.com'') && (imagesx($image) > 400) && ($pinproverka!=true) ) { imagecopymerge($image, $watermark, $dest_x - 5, 5, 0, 0, $watermark_width, $watermark_height, 100); }
imagegif($image);
imagedestroy($image);
imagedestroy($watermark);
?>
Puede proteger dinámicamente una carpeta usando htaccess y la IP de los usuarios.
Agregue un archivo .htaccess a su carpeta de imágenes con las siguientes líneas:
order deny,allow
deny from all
Luego use PHP para insertar la IP de los usuarios en el archivo htaccess cuando inicien sesión de esta manera:
<?
$ip = $_SERVER[''REMOTE_ADDR''];
if (!filter_var($ip, FILTER_VALIDATE_IP)) exit();
$file = $_SERVER["DOCUMENT_ROOT"].''/YOUR_IMAGE_FOLDER/.htaccess'';
$current = file_get_contents($file);
$current .= "allow from ".$_SERVER[''REMOTE_ADDR'']." #".$_SESSION[''id'']."/n";
file_put_contents($file, $current);
?>
La carpeta se bloqueará desde cualquier ip que no haya iniciado sesión.
Tenga en cuenta que revisé para ver si el ip es válido. Es importante que no le de al usuario ninguna forma de insertar su propio código en su archivo htaccess.
También tenga en cuenta que pongo la identificación de los usuarios en un comentario a la derecha de la ip en el archivo htaccess. Cuando el usuario cierra la sesión, puede buscar el archivo htaccess y eliminar la dirección IP del usuario.
Puede actualizar esto en cada solicitud para evitar que los usuarios que usan ips dinámicos sean expulsados.
Utilizo este método con todas las áreas de miembros, es una excelente capa de seguridad añadida. Solo asegúrese de colocar sus scripts de inicio de sesión fuera de la carpeta de miembros.
Agregue una regla de denegar en su .htaccess
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://(www/.)?domain/.ltd [NC]
RewriteCond %{HTTP_REFERER} !^http://(www/.)?domain/.ltd.*$ [NC]
RewriteRule /.(gif|jpg|js|txt)$ /messageforcurious [L]
Esto podría ser útil: Permitir / denegar enlaces de imagen con .htaccess
Editar: Una cosa a tener en cuenta acerca de este método es que algunos programas de Navegador / AV / Cortafuegos eliminan los datos de Referer cuando navegas, lo que haría que los usuarios potencialmente legítimos sean tratados como enlaces directos.
Si su sitio ya usa algún tipo de autenticación o sistema de sesión, entonces sería mejor usar el método dado en la respuesta de @Mark Baijens.
Actualización: regla de reescritura NGiNX para evitar hotlinking:
location ~* (/.jpg|/.png|/.css)$ {
valid_referers blocked mydomain.com www.mydomain.com;
if ($invalid_referer) {
return 444;
}
}