بلاک رفرالهای اسپم در nginx

امروز همکارم بهم گفت که این سایت buttons-for-website.com چیه که توی آمار referer سایت رتبه بالایی رو داره. در حقیقت این سایت‌ها اسپم هستند، اسپم از نوع referer. قضیه خیلی ساده است یک کسی یکسری درخواست جعلی با یک referer جعلی به سرور شما ارسال میکنه و شما فکر می‌کنید که یک بازدید کننده سایت شما رو بازدید کرده درصورتی که اصلا بازدید کننده ای در کار نبوده و یک ربات وارد سایت شما شده، با یک referer جعلی، تنها تصوری که من از هدف این اسپم‌ها دارم تبلیغاتی بودن اون‌هاست. اینکه هرجا که قرار باشه رفررهای سرور شما دیده بشه، این سایت‌ها هم نشون داده میشن. البته ممکنه دلایل دیگر زیادی هم داشته باشه که حداقل من از اون‌ها بی‌خبر هستم.
راه حل مناسب برای مقابله با این اسپم‌ها بلاک کردن درخواست‌هایی هستند که referer جعلی دارند. جعلی یعنی همون سایت‌های شناخت شده‌ای که قبلا دیده شدند، چون هیچ راهی برای تشخیص جعلی بودن یا نبودن یک درخواست وجود نداره.

اول باید به سراغ فایل /etc/nginx/nginx.conf بریم و درون بلوک http کد زیر رو وارد کنیم


1
2
3
4
5
6
7
8
##
# Referer spam
##
map $http_referer $bad_referer {
default 0;
"~*buttons-for-website.com" 1;
}

با استفاده از دستور map قصد داریم متغییر جدید به نام $bad_referer ایجاد کنیم تا بتونیم بدها رو از خوب‌ها تشخیص بدیم.
همانطور که در کد اضافه شده می‌بینیم بصورت پیش‌فرض $bad_referer برابر مقدار 0 یا همون false هست و فقط در صورتی که $http_referer با سایت مورد نظر ما مطابقت داشته باشه این مقدار 1 یا true میشه. همیچنین دو کاراکتر ~* قبل از اسم سایت نشان‌دهنده عدم حساسیت به حروف بزرگ و کوچک است.
توجه داشته باشید که دستور map تنها درون بلوک http قابل استفاده است.
تنها کافیه سری به تنظیمات سایت خودمون بزنیم (فرض کنیم آدرس /etc/nginx/conf.d/default ) و درون بلوک server متغیرر $bad_referer رو چک کنیم در صورت لزوم درخواست رو بلاک کنیم.


1
2
3
if ($bad_referer) {
return 444;
}

توجه داشته باشید که نمیتونیم دستور if رو درون بلوک http بنویسیم و باید درون بلوک server نوشته بشه. همچنین کد 444 در nginx با این معنی است که هیچ خروجی‌ای به درخواست‌دهنده برگردونده نشه.
حال nginx خودمون رو ریستارت میکنیم و کار تموم. همیشه قبل از ریستارت با دستور nginx -t از صحت تنظیمات خود اطمینان حاصل کنید. هرچند در نسخه‌های جدید nginx خودش این کار رو انجام میده و در صورت وجود خطا سرور رو ریستارت نمیکنه.


1
service nginx restart

برای اطمینان از درستی کار میتونیم یک درخواست با curl به سایت خودمون بفرستیم و خروجی رو ببینیم.


1
curl -e "http://www.buttons-for-website.com" "http://moror.ir"

خروجی این دستور:


1
curl: (52) Empty reply from server

تا اینجا کار تمومه و ما به هدف خودمون رسیدیم. فقط درصورتی که بخوایم لیست بزرگی از اسپم‌ها داشته باشیم میتونیم تنظیمات خودمون توی فایل /etc/nginx/nginx.conf رو کمی بهتر کنیم و یک فایل (bad_referer.map) بسازیم و سایت‌های بد بد مورد نظر خودمون رو توی این مشخص کنیم.
پس درون فایل /etc/nginx/nginx.conf اینچنین می‌نویسیم.


1
2
3
4
5
6
7
8
##
# Referer spam
##
map $http_referer $bad_referer {
default 0;
include /etc/nginx/bad_referer.map;
}

فایل /etc/nginx/bad_referer.map رو هم ساخته و سایت‌ها رو لیست می‌کنیم.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"~*floating-share-buttons.com" 1;
"~*event-tracking.com" 1;
"~*free-social-buttons.com" 1;
"~*100dollars-seo.com" 1;
"~*buttons-for-website.com" 1;
"~*videos-for-your-business.com" 1;
"~*get-free-traffic-now.com" 1;
"~*success-seo.com" 1;
"~*trafficmonetize.org" 1;
"~*4webmasters.org" 1;
"~*webmonetizer.net" 1;
"~*sitevaluation.org" 1;
"~*dailyrank.net" 1;
"~*rightrelevance.com" 1;
"~*best-seo-offer.com" 1;
"~*semaltmedia.com" 1;

References: