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"?


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;
}

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


2
Arahan istirahat tidak akan pernah tercapai karena pengembalian menghentikan pemrosesan permintaan saat ini.
Xavier Lucas

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.