سایت وردپرسی شما هک شده یا لاگینهای عجیب میبینید؟
صبح جمعه از خواب بیدار میشوید و سایت شما به یک صفحه قمار فروشی تبدیل شده است. یا بدتر از آن، گوگل به بازدیدکنندهها هشدار میدهد که سایت شما «فیشینگ» است. این سناریو برای هزاران مدیر سایت وردپرسی در ایران تکرار شده است. اگر به تازگی لاگینهای ناموفق زیادی در گزارشهای سرور میبینید، یا فایلهای ناشناخته در پوشه uploads ظاهر شدهاند، وقت آن رسیده که امنیت وردپرس را جدی بگیرید. این مقاله برای کسی است که الان با این مشکل دست و پنجه نرم میکند، نه برای فردی که میخواهد «آشنایی کلی» پیدا کند.
حمله به وردپرس معمولاً از یکی از سه راه انجام میشود: ورود اجباری (brute force)، حفره در افزونه یا قالب، و ضعف در تنظیمات سرور. هر سه قابل پیشگیری هستند. اما پیشگیری نیاز به دانش فنی دارد، نه نصب یک افزونه «همهکاره» که خودش تبدیل به یک حفره جدید میشود.
اولین خط دفاع: فایل wp-config.php را قفل کنید
فایل wp-config.php قلب تپنده وردپرس است. اگر کسی به آن دسترسی پیدا کند، رمز دیتابیس، کلیدهای احراز هویت و تنظیمات امنیتی شما را میبیند. اولین قدم این است که این فایل را از دسترس مستقیم وب خارج کنید. در فایل .htaccess ریشه سایت، این قواعد را اضافه کنید:
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>
این کار دسترسی HTTP به فایل را میبندد. اما اگر سرور شما Nginx است، باید در بلاک سرور این خط را اضافه کنید:
location ~ ^/wp-config\.php$ {
deny all;
}
بعد از این تغییر، تست کنید که آدرس yoursite.com/wp-config.php خطای 403 بدهد. اگر 200 برگرداند، یعنی تنظیمات شما درست اعمال نشده است.
قدم دوم، تغییر کلیدهای احراز هویت (Salt Keys) است. اگر سایت شما قبلاً هک شده و شما فقط افزونهها را پاک کردهاید، این کلیدها ممکن است در دست مهاجم باشد. از آدرس https://api.wordpress.org/secret-key/1.1/salt/ کلیدهای جدید بگیرید و در فایل wp-config.php جایگزین کنید. بعد از این کار، همه کاربران باید دوباره وارد شوند. این یک علامت خوب است، نه یک مشکل.
محدودسازی ورود؛ جایی که اکثر سایتها شکست میخورند
حمله brute force به صفحه wp-login.php سادهترین راه نفوذ است. ابزارهایی مانند wpscan و hydra میتوانند در چند ساعت هزاران رمز عبور را امتحان کنند. اگر رمز شما admin123 یا wordpress باشد، سایت شما تا فردا صبح هک شده است.
اولین کار: نام کاربری admin را حذف کنید. اگر سایت شما هنوز کاربری با نام admin دارد، یک کاربر جدید با نقش مدیر بسازید و کاربر قدیمی را حذف کنید. این سادهترین و مؤثرترین کار است.
دومین کار: محدود کردن تعداد تلاشهای ورود. افزونههایی مانند Limit Login Attempts Reloaded این کار را انجام میدهند. اما اگر میخواهید بدون افزونه این کار را انجام دهید، میتوانید از سطح سرور با fail2ban استفاده کنید. در راهنمای امنیت SSH توضیح دادهایم که چگونه fail2ban را برای SSH پیکربندی کنید؛ همان قواعد برای لاگین وردپرس هم کار میکند، فقط باید فیلتر مربوط به Apache یا Nginx را فعال کنید.
سومین کار که خیلی از مدیران سایت انجام نمیدهند: احراز هویت دو مرحلهای (2FA) برای همه کاربران، نه فقط مدیران. یک نویسنده با رمز ضعیف میتواند درگاه ورود به سایت شما باشد. اگر از افزونهای مانند Wordfence یا iThemes Security استفاده میکنید، 2FA را برای همه نقشها فعال کنید، نه فقط مدیران.
اینجا اشتباه میکنند: افزونه محدودسازی ورود را نصب میکنید اما کش را پاک نمیکنید
بعد از نصب افزونه محدودسازی ورود، صفحه لاگین ممکن است کش شده باشد. کاربران چند بار تلاش میکنند، خطای «تلاش بیش از حد» میگیرند و شما فکر میکنید افزونه کار میکند. اما در واقعیت، مهاجم از یک IP دیگر یا از طریق پروکسی ادامه میدهد. افزونههای محدودسازی ورود باید بر اساس IP و همچنین بر اساس کوکی مرورگر محدودیت اعمال کنند. اگر افزونه شما فقط IP را چک میکند، مهاجم با تغییر IP از سرویسهایی مانند VPN یا Tor به راحتی دور میزند. افزونهای انتخاب کنید که گزینه «محدودیت بر اساس کوکی» را داشته باشد.
حذف نسخهنمایی؛ چرا باید بگویید چه نسخهای از وردپرس دارید؟
در کد HTML سایت شما، تگ متای زیر وجود دارد:
<meta name="generator" content="WordPress 6.4.2" />
این تگ به مهاجم میگوید که شما از نسخه 6.4.2 استفاده میکنید. اگر این نسخه دارای آسیبپذیری شناختهشده باشد، مهاجم دقیقاً میداند از چه اکسپلویتی استفاده کند. حذف این تگ کار سادهای است. در فایل functions.php قالب خود (یا قالب فرزند) این کد را اضافه کنید:
remove_action('wp_head', 'wp_generator');
همچنین نسخه وردپرس در فایلهای CSS و JS نیز ظاهر میشود. برای حذف آن، این کد را اضافه کنید:
function remove_wp_version_from_assets($src) {
if (strpos($src, 'ver=')) {
$src = remove_query_arg('ver', $src);
}
return $src;
}
add_filter('style_loader_src', 'remove_wp_version_from_assets', 9999);
add_filter('script_loader_src', 'remove_wp_version_from_assets', 9999);
این کار امنیت را صددرصد تضمین نمیکند، اما سطح حمله را کاهش میدهد. مهاجم همچنان میتواند از طریق الگوهای دیگر نسخه را حدس بزند، اما کار او سختتر میشود.
افزونههایی که خودشان حفرهاند
بزرگترین اشتباه در امنیت وردپرس، نصب افزونههای غیرضروری است. هر افزونه یک سطح حمله جدید است. آمار نشان میدهد که بیش از 90 درصد هکهای وردپرس از طریق افزونههای آسیبپذیر انجام میشود. نه از طریق هسته وردپرس.
افزونههای زیر را فوراً حذف کنید:
- افزونههایی که بیش از یک سال است آپدیت نشدهاند.
- افزونههایی که از مخزن غیررسمی (کرکشده یا nulled) نصب شدهاند. این افزونهها معمولاً دارای بکدور هستند.
- افزونههایی که کار یکدیگر را انجام میدهند. مثلاً سه افزونه کش مختلف.
قبل از نصب هر افزونه، این سؤال را بپرسید: «آیا میتوانم این کار را با ۱۰ خط کد در functions.php انجام دهم؟» اگر پاسخ بله است، افزونه را نصب نکنید. به عنوان مثال، برای غیرفعال کردن XML-RPC (که یک سطح حمله شناختهشده است)، این کد را به .htaccess اضافه کنید:
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
یا در functions.php:
add_filter('xmlrpc_enabled', '__return_false');
XML-RPC برای اتصال اپلیکیشنهای موبایل و سرویسهای خارجی استفاده میشود. اگر از این سرویسها استفاده نمیکنید، آن را غیرفعال کنید. حملات brute force از طریق XML-RPC میتوانند با یک درخواست، صدها رمز عبور را امتحان کنند (amplification attack).
افزونههای امنیتی: کدام را انتخاب کنیم؟
بین Wordfence، Sucuri و iThemes Security، من Wordfence را پیشنهاد میکنم. دلیلش ساده است: فایروال سطح برنامه (WAF) آن به صورت رایگان در دسترس است و پایگاه داده امضای آن بهروز است. اما Wordfence منابع سرور را مصرف میکند. اگر سایت شما روی یک سرور اشتراکی ضعیف است، شاید بهتر باشد از Cloudflare WAF استفاده کنید و افزونه سبکتری نصب کنید.
یک نکته مهم: افزونه امنیتی جایگزین پیکربندی درست سرور نیست. اگر سرور شما به روز نیست یا پورتهای غیرضروری باز هستند، هیچ افزونهای کمکی نمیکند. برای محافظت در سطح شبکه، محافظت در برابر DDoS را بررسی کنید. این سرویس لایهای از امنیت را قبل از رسیدن ترافیک به سرور شما اضافه میکند.
بهروزرسانیها را جدی بگیرید؛ اما نه کورکورانه
بهروزرسانی هسته وردپرس، افزونهها و قالبها مهمترین کار امنیتی است. اما بهروزرسانی کورکورانه میتواند سایت شما را از کار بیندازد. قبل از بهروزرسانی، از سایت خود بکاپ بگیرید. اگر از هاست اشتراکی استفاده میکنید، ابزار بکاپ هاست خود را بررسی کنید. اگر سرور اختصاصی دارید، از wp-cli برای بکاپ دیتابیس استفاده کنید:
wp db export backup-$(date +%Y%m%d).sql
سپس بهروزرسانی را در یک محیط آزمایشی (staging) تست کنید. اگر محیط آزمایشی ندارید، بهروزرسانی را در ساعت کمترافیک انجام دهید و بلافاصله سایت را چک کنید.
بهروزرسانی خودکار را برای افزونههای حیاتی فعال کنید. در wp-config.php این خط را اضافه کنید:
define('WP_AUTO_UPDATE_CORE', true);
add_filter('auto_update_plugin', '__return_true');
اما مراقب باشید: اگر افزونهای را شخصیسازی کردهاید (کد آن را تغییر دادهاید)، بهروزرسانی خودکار تغییرات شما را از بین میبرد. برای این افزونهها، بهروزرسانی خودکار را غیرفعال کنید.
مانیتورینگ و پاسخ به حادثه
هیچ امنیتی صددرصد نیست. مهم این است که حمله را زود تشخیص دهید. لاگ ممیزی را فعال کنید تا ببینید چه کسی، چه زمانی و از چه IP وارد شده است. افزونههایی مانند WP Activity Log این کار را انجام میدهند. اما لاگها فقط زمانی مفید هستند که خوانده شوند. یک هشدار ایمیلی برای رویدادهای مهم تنظیم کنید: ورود مدیر جدید، تغییر فایلهای هسته، نصب افزونه جدید.
در سطح سرور، لاگهای Apache یا Nginx را بررسی کنید. اگر حجم درخواستهای POST به wp-login.php به طور غیرعادی بالا رفته است، این یک علامت هشدار است. با دستور زیر میتوانید این را بررسی کنید:
grep "wp-login.php" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20
این دستور ۲۰ IP که بیشترین درخواست را به صفحه لاگین داشتهاند نشان میدهد. اگر IP خاصی دهها بار در دقیقه تلاش کرده است، آن را در فایروال مسدود کنید.
برای بررسی سلامت کلی سایت و اینکه آیا در لیست سیاه گوگل قرار گرفتهاید، از ابزارهای بررسی DNS و شبکه استفاده کنید. این ابزار به شما نشان میدهد که آیا رکوردهای DNS شما دستکاری شده است یا خیر. یکی از حملات رایج، تغییر رکورد DNS برای هدایت کاربران به یک سایت فیشینگ است.
جمعبندی عملی: چکلیست ۱۰ دقیقهای
اگر فقط ۱۰ دقیقه وقت دارید، این کارها را انجام دهید:
- کاربر
adminرا حذف کنید. - XML-RPC را غیرفعال کنید.
- تگ نسخه وردپرس را حذف کنید.
- کلیدهای Salt را تغییر دهید.
- افزونههای غیرضروری و کرکشده را حذف کنید.
- بهروزرسانیهای معلق را اعمال کنید.
- یک بکاپ تازه بگیرید و آن را خارج از سرور نگه دارید.
این کارها ۸۰ درصد از حملات رایج را دفع میکند. ۲۰ درصد باقیمانده نیاز به پیکربندی عمیقتر سرور دارد. اگر احساس میکنید سایت شما قبلاً هک شده و نمیدانید مهاجم چه تغییری ایجاد کرده است، بهترین کار ریست کامل است: وردپرس را از نو نصب کنید، افزونهها را یکییکی از مخزن رسمی نصب کنید و قالب را از منبع معتبر دریافت کنید. سپس تمام رمزها را تغییر دهید. این کار چند ساعت وقت میگیرد، اما مطمئنترین راه است.
اگر این کارها برایتان پیچیده است یا زمان کافی ندارید، خدمات امنیت سرورنت میتواند این بررسیها را برای شما انجام دهد. اما حتی با کمک متخصص، شما باید اصول اولیه را بدانید تا بتوانید تشخیص دهید که آیا کار درست انجام شده است یا نه.
پرسشهای پرتکرار
چگونه بفهمم سایت وردپرسی من هک شده است؟
علائم رایج هک شامل تغییر ظاهر سایت، ریدایرکت به صفحات دیگر، هشدار گوگل درباره فیشینگ یا بدافزار، و وجود فایلهای ناشناخته در پوشهها است. برای بررسی، به پوشه wp-content/uploads سر بزنید و دنبال فایلهای PHP بگردید. این پوشه نباید هیچ فایل PHP داشته باشد. همچنین کاربران جدید با نقش مدیر را در پیشخوان وردپرس بررسی کنید.
آیا افزونه Wordfence برای امنیت وردپرس کافی است؟
Wordfence یک ابزار خوب است اما کافی نیست. افزونههای امنیتی فقط بخشی از مشکل را حل میکنند. پیکربندی درست سرور، بهروزرسانی منظم و حذف افزونههای غیرضروری به همان اندازه مهم هستند. اگر Wordfence نصب کردهاید اما هنوز از رمز ضعیف استفاده میکنید یا افزونههای قدیمی دارید، امنیت سایت شما همچنان در خطر است.
چرا باید XML-RPC را غیرفعال کنم؟
XML-RPC یک پروتکل قدیمی است که برای اتصال اپلیکیشنهای خارجی به وردپرس استفاده میشود. مهاجمان از آن برای انجام حملات brute force با حجم بالا استفاده میکنند، زیرا با یک درخواست میتوانند صدها رمز عبور را امتحان کنند. اگر از اپلیکیشن موبایل وردپرس یا سرویسهای خارجی که به XML-RPC نیاز دارند استفاده نمیکنید، آن را غیرفعال کنید.
بعد از هک شدن سایت، چه کارهایی باید انجام دهم؟
اول، سایت را به حالت تعمیر و نگهداری ببرید. دوم، از دیتابیس و فایلها بکاپ بگیرید (برای بررسی بعدی). سوم، تمام رمزها را تغییر دهید: رمز هاست، دیتابیس، FTP و همه کاربران وردپرس. چهارم، افزونهها و قالب را حذف کنید و وردپرس را از نو نصب کنید. پنجم، افزونهها را یکییکی از مخزن رسمی نصب کنید و سایت را بررسی کنید. اگر نمیدانید مهاجم چه تغییری ایجاد کرده، ریست کامل امنترین گزینه است.
دیدگاهها ۰
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!