¿Hay alguna forma elegante de bloquear un grupo de referencias a la vez?

21

Para evitar el spam de referencia, mi nginx.conf contiene una sección como esta:

if ($http_referer ~* spamdomain1\.com) {
    return 444;
}
if ($http_referer ~* spamdomain2\.com) {
    return 444;
}
if ($http_referer ~* spamdomain3\.com) {
    return 444;
}

Estas reglas le indican a nginx solo que cierre la conexión si el usuario tiene configurado uno de estos referentes. ¿Hay alguna forma más elegante de hacer esto? ¿Puedo definir una lista de estos dominios y luego decir algo como "Si el referente está en esta lista, devuelva 444"?

Bdesham
fuente
cree un archivo grande como el de la muestra y úselo como archivo de inclusión cuando sea necesario.
Hrvoje Špoljar

Respuestas:

31

Intentaría un map :

map $http_referer $bad_referer {
    default                  0;
    "~spamdomain1.com"       1;
    "~spamdomain2.com"       1;
    "~spamdomain3.com"       1;
}

Luego úsalo así:

if ($bad_referer) {
    return 444;
}
Michael Hampton
fuente
1
Dado que el mapa utiliza tablas hash, este enfoque funcionará mejor que una serie de comprobaciones individuales. Lea los documentos para ver las opciones que se podrían usar, como hostnamesy posiblemente includeun archivo separado donde se enumeran, podría facilitar el mantenimiento.
Brian
Al leer los documentos relacionados con mapme interesó ver si uno podría usar expresiones regulares para hacer coincidir ciertos referentes ya que OP está haciendo coincidir expresiones regulares utilizando el ~*operador, y de hecho simplemente especificando la regla del mapa como"~*spamdomain4.com" 1; hará el truco. ¡Ordenado!
Hrvoje Špoljar
Tienes razón, y esto necesita usarlo de todos modos.
Michael Hampton
Usar la hostnamesopción sería simplemente.spamdomain4.com 1;
Brian
44
@Brian El campo de referencia es una URL completa, no simplemente un nombre de host. Entonces eso no funciona.
Michael Hampton
13

Podría usar lógico ORpara elaborar una declaración de coincidencia múltiple, por ejemplo

if ($http_referer ~ "spamdomain1\.com|spamdomain2\.com|spamdomain3\.com")  { 
  return 444;
}

EDITAR por comentario; quitando break;del bloque

Hrvoje Špoljar
fuente
2
La directiva de interrupción nunca se alcanzará ya que la devolución detiene el procesamiento de la solicitud actual.
Xavier Lucas
3

ngx_http_referer_module es otra forma de hacerlo. Ejemplo de Referer Spam Blocking :

location / {
  valid_referers none blocked *.badreferer1.com badreferer2.com *.badreferer3.com badreferer4.net;

  if ($invalid_referer) {
    return   403;
  }
}
davejenx
fuente