Apakah ada cara yang bagus untuk memblokir banyak referensi sekaligus?

21

Untuk mencegah spam pengarah, nginx.conf saya berisi bagian seperti ini:

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

Aturan ini memberi tahu nginx hanya untuk menutup koneksi jika pengguna memiliki salah satu dari rujukan ini ditetapkan. Apakah ada cara yang lebih elegan untuk melakukan ini? Bisakah saya mendefinisikan daftar domain ini dan kemudian mengatakan sesuatu seperti, "Jika pengarah ada dalam daftar ini maka kembalikan 444"?

bdesham
sumber
buat satu file besar cukup seperti yang dari sampel dan gunakan sebagai file termasuk di mana diperlukan.
Hrvoje Špoljar

Jawaban:

31

Saya akan mencoba map:

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

Kemudian gunakan seperti ini:

if ($bad_referer) {
    return 444;
}
Michael Hampton
sumber
1
Karena peta menggunakan tabel hash, pendekatan ini akan berkinerja lebih baik daripada serangkaian pemeriksaan individual. Baca dokumen untuk opsi yang dapat digunakan, seperti hostnamesdan mungkin includedari file terpisah di mana mereka terdaftar dapat membuatnya lebih mudah untuk dipelihara.
Brian
Membaca dokumen yang terkait dengan mapsaya tertarik untuk melihat apakah seseorang dapat menggunakan regex untuk mencocokkan referensi tertentu karena OP melakukan pencocokan regex menggunakan ~*operator, dan memang hanya menentukan aturan peta seperti "~*spamdomain4.com" 1;akan melakukan trik. Rapi!
Hrvoje Špoljar
Anda benar, dan ini harus tetap digunakan.
Michael Hampton
Menggunakan hostnamesopsi itu akan sederhana.spamdomain4.com 1;
Brian
4
@Brian Bidang referer adalah URL lengkap, bukan hanya nama host. Jadi itu tidak berhasil.
Michael Hampton
13

Anda bisa menggunakan logika ORuntuk membuat satu pernyataan multi-pertandingan misalnya

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

EDIT per komentar; menghapus break;dari blokir

Hrvoje Špoljar
sumber
2
Arahan istirahat tidak akan pernah tercapai karena pengembalian menghentikan pemrosesan permintaan saat ini.
Xavier Lucas
3

ngx_http_referer_module adalah cara lain untuk melakukannya. Contoh dari Pemblokir Spam Referer :

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

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