¿Cómo evitar el enlace activo ("robo de imagen" / "robo de ancho de banda") de recursos en mi sitio?


8

Estoy tratando de escribir el "último" enlace caliente .htaccess ...

Puede encontrar muchos ejemplos / tutoriales / generadores en la red, pero muchos de ellos son incorrectos o están incompletos (o incluso ambos).

Estas son las características que estoy buscando:

  • Debe bloquear el enlace activo para una lista de extensiones de archivo cuando HTTP_REFERER es un sitio extraño.
  • Debe permitir el enlace activo para el dominio actual (duh) sin codificarlo en .htaccess.
    • Para el dominio actual, debe funcionar bajo http y https.
    • Para el dominio actual debe funcionar con www y sin www.
  • Debe poder agregar dominios de excepciones a estas reglas (como nuestro amigo Google) y estos dominios deben funcionar bajo http y https y con www o sin www.

Esto es lo que he logrado hasta ahora:

<IfModule mod_rewrite.c>

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com/.*$ [NC]
RewriteRule \.(gif|jpe?g|png|zipx?)$ - [NC,F]

</IfModule>

Mis preguntas:

  1. ¿Cómo evitar codificar mydomain.comen el .htaccess? (Sería genial poder implementar este .htaccess en todos mis dominios sin tener que modificarlo para cada uno de ellos).
  2. En mi RewriteRule, ¿ gif|jpe?g|png|zipx?es equivalente a la gif|jpg|jpeg|png|zip|zipxderecha? (Lo siento, todavía es nuevo en las expresiones regulares).
  3. ¿Ves algo malo en mi .htaccess que desconozco?

Para el # 1 sé que es algo posible. Lo más cercano que encontré es este fragmento que elimina el www de la URL sin codificar el dominio. ¿Hay alguna manera de usar este método para mi pregunta # 1?

RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteCond %{HTTPS}s/%1 ^(on(s)|offs)/(.+)
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]

Actualizar:

Soy consciente de las soluciones que servirán una imagen con marca de agua en lugar de la imagen normal. Pero no estoy buscando este tipo de solución. Quiero una solución universal (servir 403 errores) que funcione para todo tipo de archivos binarios (zip, exe, iso, jpg, png, gif ...).


En mi humilde opinión, Apache debería venir con este archivo de configuración al menos como una opción para incluir. Me pregunto si algún desarrollador de Apache estaría dispuesto a agregarlo si usted / nosotros pudiéramos encontrar uno.
Chris Nava


@ Tom O'Connor Lectura interesante y estoy de acuerdo con eso. Pero mi script en mi caso se usará para archivos binarios grandes (como zip, exe ...) y no para imágenes y demás. Entonces todavía necesitaría obtener una respuesta. Sí, el ancho de banda es barato, pero un zip de 500 MB no es lo mismo que un jpg de 100 KB ...
AlexV

No estaba esquivando una respuesta. Solo estaba quejándome;)
Tom O'Connor

Respuestas:


9

Independientemente de lo que haga, perderá los ciclos de la CPU (para determinar si el sitio de referencia (el que realiza el enlace) está autorizado o no, debe realizar un procesamiento de los datos de la solicitud).
Lo único que puede hacer es ahorrar ancho de banda mientras desperdicia un mínimo de ciclos de CPU.

Hay algunos ejemplos en los documentos de Apache que hacen exactamente lo que quieres. Éste:

SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>

parece ser el más aplicable (y no requiere el peso completo de mod_rewrite).
Puede agregar referencias válidas adicionales con directivas SetEnvIfy adicionales Allow.


No está mal, pero necesito una solución que no codifique el nombre de dominio en el htaccess (lea mi pregunta cuidadosamente).
AlexV

A continuación, necesita una solución programática como Oliver propuso (que todavía requiere que codificar una lista, expresión regular, o alguna otra representación de los remitentes permitidos - Simplemente le permite poner en un archivo discreto)
voretaq7

No necesariamente si nos fijamos en mi segundo bloque de código se puede ver que se puede hacer ... sólo hay que adaptarlo a mi caso ...
AlexV

Puede usar la lógica de limpieza en su segundo bloque de código (o magia similar solo %{HTTP_HOST}para un menor análisis de expresiones regulares) para insertar el host de la URL en su conjunto de reglas, lo que debería comprarle dominios locales dinámicos (prueba exhaustiva), pero aún necesitaría hacerlo -code "buenos" los referentes externos como Google (por el referente, el agente de usuario, IP, etc.)
voretaq7

3

¿Qué tal escribir una regla que, si el árbitro es desconocido (prohibido), simplemente llame a un archivo Php donde pase la imagen como parámetro, y en el archivo Php, simplemente ponga en rojo: "este archivo proviene de MYWEBSITE.COM y no tiene autorización oficial para mostrarse aquí ".

En cuanto a su pregunta, haga que su regla sea global. Corríjame si me equivoco, pero si la regla se declara antes de cualquier vhost, se aplicará a todos los vhost (tipo de "regla predeterminada").

Y otra idea es simple: simplemente redirija a un archivo Php (aquí filter.php) que buscará en el sitio web autorizado y devolverá el archivo requerido si todo está bien:

RewriteRule /(.*)\.jpg$ /filter.php?im=$2\.jpg [QSA,L]

En filter.phpsolo cargar dinámicamente una lista de vhost o algo así:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}

Es una posibilidad, pero no quiero "desperdiciar" CPU sobre esto (usando PHP). Solo quiero servir 403s. También con PHP, debe administrar todos los problemas de almacenamiento en caché y esto puede ser bastante complejo.
AlexV

1

Cloudflare puede ser de alguna ayuda para usted: http://www.cloudflare.com

Sin embargo, esto solo funciona para imágenes, pero eso parece ser lo que buscas.

Protección Hotlink

Habilite automáticamente la protección de hotlink para sus imágenes para evitar enlaces externos. A los referentes que no estén en la zona y que no estén en blanco se les negará el acceso. Las extensiones de archivo admitidas son gif, ico, jpg, jpeg y png.

Protegido: http://mydomain.com/images/pic.jpg Para omitir: http://mydomain.com/images/hotlink-ok/pic.jpg


0

Pregunta 1:

RewriteEngine en
RewriteCond% {HTTP_REFERER}! ^ Http: // (. +)? Yoursite.com/ [NC]
RewriteCond% {HTTP_REFERER}! ^ $
RewriteRule. *. (Jpe? G | gif | bmp | png) $ - [F]

Pregunta 2:

si

Pregunta 3

Yo usaría mi


Para la pregunta 1, "yoursite.com" está codificado, por lo que no es útil.
AlexV

@ AlexV: No lo es. Basta con sustituir yoursite.com con su dirección que desea permitir y otros referers dejarán de descargar cualquier imagen
génesis

¿Y cómo me permito sin codificarlo?
AlexV

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.