I. Tổng quan

Tiêu đề referer trong HTTP header sẽ hiển thị địa chỉ website trước đó mà từ đó có một liên kết đến trang trang web đang được kiểm tra. Nói một cách đơn giản hơn, referer là URL mà từ đó máy chủ nhận được một yêu cầu. Một ví dụ điển hình là nếu bạn nhấp vào một liên kết trên trang trên trang web ở địa chỉ website.com/page để chuyển đến mysite.com/link, HTTP Referer nhận được trên mysite.com sẽ có giá trị là website.com/page.

Việc tạo ra một yêu cầu với giá trị referer là khá dễ dàng, do vậy bên ngoài có thể lợi dụng việc này để truy vấn liên tục đến website làm tăng tài nguyên đột ngột trên server.

Trong bài viết này, Long Vân sẽ hướng dẫn các bạn cấu hình các rule để lọc các truy vấn với giá trị referer giả mạo, qua đó hạn chế các truy vấn xấu.

II. Khi nào cần sử dụng

  1. Khi website có dấu hiện bị spam liên tục bởi các request có referer trong headhe, như hình dưới:
    • Trong log access
    • Trong các dòng log error sẽ có giá trị referer
  2. Ngoài ra, bạn có thể chủ động cấu hình để ngăn chặn trước nguy cơ bị phá hoại.

III. Hướng dẫn cấu hình

  1. Bước 1: Tạo file /etc/nginx/referer_blacklist.conf chứa các website cần chặn referder nội dung như sau:
    map $http_referer $void_referer {
        hostnames;
        default                    0;
        "~*.example.com"          1;
        "~*.example.org"          1;
    }

    Kỹ tự đầu tiên ở mỗi dòng phải là “~”. Mỗi biểu thức sẽ được so sánh đầu sau “http://” hoặc “https://” . Giá trị “.example.com” sẽ khớp với các tên máy chủ như example.com, abcexample.com và sub.example.com.

  2. Bước 2: Cấu trong file nginx.conf . Đưa danh sách blacklist vào khối http chính để nó có thể được sử dụng trong mọi website trên server.
    http {
        [...]
        # void_referer
        include referer_blacklist.conf;
        [...]
  3. Bước 3: Cấu hình trong file cấu hình nginx của website, bỏ trong thẻ server trong file cấu hình
    server {
        [...]
        if ($void_referer) {
            return 403;
        }
        [...]
  4. Bước 4: Reload lại service nginx bằng lệnh
    sudo systemctl reload nginx
  5. Bước 5: Kiểm tra lại cấu hình với lệnh url
    • Với truy vấn thông thường, server tiếp nhận và xử lý thành công:
      $ curl -s -o /dev/null -I -w "%{http_code}n" https://domain.test.io
      200
    • Với truy vấn sử dụng referer từ google (một URL không có trong phần blacklist), kết quả vẫn truy vấn thành công
      $ curl -s -o /dev/null -I -w "%{http_code}n" --referer http://google.com https://domain.test.io
      200
    • Với truy vấn sử dụng referer từ example.com, kết quả truy vấn lỗi.
      curl -s -o /dev/null -I -w "%{http_code}n" --referer http://example.com https://domain.test.io
      403

Như vậy, Long Vân đã hướng dẫn Quý khách cấu hình ngăn chặn các truy vấn referer spam đến server. Chúc Quý khách thàng công !