¿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 ...).

AlexV
fuente
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
55
No lo hagas He aquí por qué - tomoconnor.eu/blogish/mod-rewrite-killing-social-media
Tom O'Connor
@ 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.

voretaq7
fuente
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 ...
   }
}
Olivier Pons
fuente
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

pablo
fuente
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

génesis
fuente
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
-1

¿O usar CoralCDN y dejar que la gente haga hotlink al contenido de su corazón?

Tom Newton
fuente