«افزونه‌ای که دانلود کردم ویروس داشت» — در سه سال گذشته، این جمله را در سه پروندۀ واقعیِ پاکسازی شنیده‌ام؛ سه سایت که از بیرون سالم بودند ولی در پوشۀ آپلود، لینک‌های کازینویی پنهان کرده بودند. در هر سه مورد، سناریو یکی بود: صاحب سایت، افزونۀ پولی معروف را از جایی «رایگان» دانلود کرده بود. این مقاله را دقیقاً برای شکستنِ همان وسوسه می‌نویسم، ولی نه با شعار؛ با فیلترهای قابل‌اجرا. در بازار ایران، مسئله از «مخزن یا نه» پیچیده‌تر است: افزونه‌های پولیِ محبوب اینجا «نال» می‌شوند، سایت‌های زیادی آن‌ها را رایگان می‌فروشند، و تشخیصِ منبعِ سالم از منبعِ آلوده، مهارتِ بصری نمی‌خواهد — مهارتِ روش‌مند می‌خواهد. هفت فیلترِ من را بخوانید، آناتومیِ افزونۀ آلوده را بشناسید، چک‌لیستِ سه‌دقیقه‌ایِ پیش‌از‌نصب را تمرین کنید، و اگر فاجعه رخ داده، بدانید دقیقاً کدام قدم‌ها را به‌چه ترتیبی بردارید.

چرا افزونه، دروازۀ اصلی نفوذ است؟

یک افزونۀ وردپرس، مجوزِ اجرای کد با دسترسیِ کاملِ PHP روی سرور شماست — همان سطحی که هستۀ وردپرس دارد؛ نمی‌تواند «فقط دکمه بگذارد» و «چیزی از خودش اضافه نکند». وقتی افزونه‌ای نصب می‌کنید، عملاً از یک غریبه می‌خواهید کلِ ساختمان را برایتان بچیند و در عوض، کلیدِ اتاقِ سرور را هم به او می‌دهید. به همین دلیل، اکثرِ پرونده‌های آلودگی از همین‌جا وارد می‌شوند — نه از ضعفِ رمز، نه از حملهٔ Brute Force؛ در مقالۀ «بدافزار چیست و چگونه وارد سایت می‌شود؟» سهمِ هر دروازه را از تجربه‌های واقعی نوشته‌ام. مقایسۀ ساده: اگر وردپرس را خانه بدانید (همان نقشۀ «وردپرس چیست و چطور شروع کنیم؟»)، هسته و مخزن رسمی مثل مصالحِ استانداردند؛ افزونه‌های دست‌چین‌شده مثل نجارِ بیمه‌اند؛ و افزونۀ نال، کلیدداری است که هیچ‌کس نشناسش و مفت هم کار کند. تفاوتِ «افزونه از نظر کارکرد چیست» را یک‌جا در «افزونۀ وردپرس چیست» گفته‌ام؛ اینجا بحث، جنسِ کلیددار است نه کارکردش.

هر افزونه‌ای که نصب می‌کنید، شهروندِ درجه‌یکِ سرور شماست؛ حقِ وکالتِ کامل، بدونِ سوگند. مسئله این نیست که «چه کاری می‌کند» — مسئله این است که «هر چه بخواهد می‌تواند بکند».

فیلتر هفت‌گانۀ انتخاب منبع

این هفت سوال را به‌همین ترتیب بپرسید؛ هر «نه» یک پرچم زرد است و هر پرچم قرمز یعنی خاتمه:

  1. مخزن رسمی وردپرس؟ اولین و مهم‌ترین: افزونه‌های رایگانِ معتبر همه در wordpress.org/plugin هستند — پیش از بررسی‌شان، مرورِ کدِ عمومی و بازبینیِ دستیِ تیم امنیتی وردپرس از سر می‌گذرند. اگر افزونه‌ای در مخزن نیست و پولی هم نیست، سؤالِ بعدی بزرگ‌تر می‌شود: «پس چرا؟»
  2. سایتِ خودِ توسعه‌دهنده؟ افزونۀ پولی فقط از سایت خود سازنده یا مارکتِ معتبر (مثل CodeCanyon) باید دانلود شود — لینکِ «دانلود مستقیمِ» پراکنده در تلگرام و سایت‌های ناشناس، نه.
  3. تازگیِ به‌روزرسانی؟ سه سال‌نشدۀ افزونه در مخزن یعنی: توسعه‌دهنده رفته و حفره‌های امنیتیِ کشف‌شده در نسخۀ شما می‌مانند؛ افزونۀ «قدیمیِ محبوب» هم می‌تواند مثلِ تازه، خطرناک باشد.
  4. شماره نسخه در برابر تغییرات (changelog)؟ افزونۀ سالم، تاریخچۀ نسخه دارد؛ اگر changelog خالی بود یا نسخه‌ها بی‌ربط جهیدند، پرونده مشکوک است.
  5. تعداد نصب و نظراتِ واقعی؟ نظرهای یک‌خطیِ صفر‌تاریخ و ستاره‌های چک‌چینی، خریدنی‌اند؛ نظراتِ با جزئیاتِ فنی و تاریخ‌دار، نشانهٔ حیات.
  6. اندازۀ فایل معقول؟ افزونۀ ۵۰۰ کیلوبایتی که ناگهان ۱۲ مگابایت شده، احتمالاً چیزی در دلش پنهان کرده؛ فایل‌های تصویری و JSِ بی‌نامِ عجیب درون zip، از همان جنسند.
  7. اسکندرِ توسعه‌دهنده؟ سایت سازنده را باز کنید؛ اگر فقط «افزونه‌های نالِ رایگان» می‌فروشد و هیچ نشانی/تیم/تماس ندارد، با حسابِ کاربری‌تان خداحافظی کنید.

دو فیلترِ اول را جدی بگیرید: در سه سال مشاوره، تقریباً هر پروندۀ آلودگی‌ای که دیدم، فیلترِ اول یا دوم را نقض کرده بود. بقیه، سطحی‌اند. یک ضمیمهٔ عملی برایشان: همین لیست را در یادداشتِ «افزونه‌های مجاز» نگه دارید و هر سه ماه، افزونه‌های موجود را با همان سه سؤالِ اول مرور کنید؛ افزونه‌ای که دیروز رد شد، امروز با یک آپدیتِ آلوده می‌تواند رد نشود — امنیتِ منبع، تصمیمِ لحظه‌ای نیست، عادتِ فصلی است. در همان سه پرونده، همین عادتِ ده‌دقیقه‌ای تفاوتِ بین «پاکسازیِ یک‌روزه» و «سایتِ از دست‌رفته» بود.

آناتومی افزونۀ نال و آلوده

«نال» (nulled) یعنی نسخۀ پولی‌ای که قفلِ لایسنس از آن شکسته شده. سؤالِ اکثر خریدارانِ نال این است: «آیا کرک‌شدن به‌خودی‌خود خطرناک است؟» پاسخ صادقانۀ فنی: کرک به‌تنهایی نه؛ ولی دو خطرِ ساختاری به‌همراه دارد. خطر اول — ناشرِ ثانوی: کرک‌کننده به کد افزونه دسترسیِ کامل داده تا آن را دست بزند؛ شما به «مهندسِ ناشناسی» اعتماد کرده‌اید که دقیقاً همان سطحِ دسترسی‌ای که خود افزونه دارد به سرور شما، الان می‌تواند کدِ دلخواهش را هم قاطی‌اش کرده باشد — و در نال‌های بازار ایران، تجربه نشان داده بیشترِ موارد همین‌طور هست. خطر دوم — بلوکه‌شدنِ به‌روزرسانی: افزونۀ نال یا آپدیت نمی‌شود (چون سرورِ لایسنس را حذف کرده‌اند) یا با آپدیتِ نال‌شکنۀ جدید، حفرۀ امنیتیِ شناخته‌شدۀ نسخهٔ قبل روی سرورتان باقی می‌ماند؛ یعنی یک دیکشنریِ عمومیِ CVE برای مهاجم می‌ماند که می‌داند روی هزاران سایت، دقیقاً چه نسخه‌ای با چه سوراخی نصب است. مکان‌های قایمگاهِ backdoor در افزونۀ آلوده (از همان سه پرونده): فایل‌هایِ جایگزینِ کثیف در deepِ پوشه (یک CSSِ کوچک با کدِ evalِ فشرده)، «تصاویر»ِ درون‌خطیِ base64 در functions، cronهای زمان‌بندی‌شده برای لینک‌سازی، و اکانت‌های مدیرِ مخفی که آدرسِ ایمیل‌شان از جنسِ لاگِ سیستم است. چطور پیدا کنید؟ اگر سررشته ندارید، «پیدا کردن بدافزار مخفی در وردپرس» روشِ بررسی را گام‌به‌گام دارد و ابزارهایش در «بهترین ابزارهای اسکن بدافزار»؛ ولی چک‌لیستِ سه‌دقیقه‌ایِ پیش‌از‌نصبِ بخش بعد، جلوی هشتادِ درصدِ این پرونده‌ها را بیرونِ سرور می‌گیرد.

چک‌لیست سه‌دقیقه‌ای پیش از نصب

پیش‌از‌آن‌که zip را در پیشخوانِ «افزونه‌ها ← افزودن ← بارگذاری» رها کنید، سه دقیقه وقت بگذارید — همین سه دقیقه در همان سه پرونده، نجات‌دهنده بود:

  1. zip را باز کنید و به نام‌ها نگاه کنید: افزونۀ نرمال، ساختارِ قابل‌پیش‌بینی دارد (پوشۀ اصلی با نامِ افزونه، فایلِ PHPِ اصلی با هدرِ شرح). پوشه‌هایی با نام‌هایِ بی‌ربط، فایل‌هایِ .jpg که اندازه‌شان غیرعادی است (۳۰۰ کیلوبایت برای آیکونِ ۳۲پیکسلی!)، و فایل‌هایی با نام‌هایِ «wp-styles-min.php» که در فهرستِ فایل‌های PHP اصلیِ مخزن نیستند، پرچم قرمزند.
  2. در فایل اصلی بگردید: با هر ویرایشگر متن، این الگوها را جست‌وجو کنید: eval(، base64_decode، str_rot13، gzinflate، create_function، system(، shell_exec، و آدرس‌های httpِ بی‌ربط (معمولاً دامنه‌هایِ چینی/روسیِ متفرقه برای «بازخوانی» کد). یک base64_decode به‌تنهایی حکم نمی‌دهد (بعضی افزونه‌های قانونی هم دارند)، ولی ترکیبش با eval و فایلِ ناشناس، امضایِ آشنایِ backdoor است. کدِ آلوده چطور اجرا می‌شود و کجا قایم می‌شود را کامل‌تر در «بدافزار مخفی در وردپرس چگونه پیدا می‌شود؟» باز کرده‌ام.
  3. هش در فایل اصلی: نامِ افزونه با «نامِ نال‌شده» بخورد؟ نسخه‌های نال، معمولاً هدرِ شرحِ افزونۀ اصلی را نگه می‌دارند ولی فایلِ licesnse/activate را حذف/کرک کرده‌اند؛ اگر «لایسنس» حذف شده و بقیه دست‌نخورده به‌نظر می‌رسد، دقیقاً همان‌جایی‌ست که کد تزریق می‌شود.
  4. اگر توانستید، هاش را با نسخۀ اصلی مقایسه کنید: برای افزونه‌های رایگان، می‌توانید همان نسخه را مستقیم از مخزن دانلود و فایل‌ها را diff کنید؛ هر اختلافِ بی‌دلیل یعنی نصب نکنید.

و اگر هیچ‌کدام از این‌ها برایتان ممکن نیست، یک قانونِ جانشینِ بی‌خطا دارید: نصب فقط از مخزن رسمی از راه داشبورد. افزونۀ نالِ پولی را هم هیچ‌وقت نصب نکنید؛ به‌جایش یا بخرید یا جایگزینِ رایگانِ سالمش را در مخزن پیدا کنید — در راهنمای «افزونه‌های ضروری وردپرس» برای هر نیازِ پولی، بدلِ مخزنیِ قابل‌اتکا معرفی کرده‌ام؛ حتی افزونه‌های سئو (مقایسۀ پولی‌ها در «بهترین افزونه‌های سئو» و نبردِ دو غول در «Yoast یا Rank Math») و ریدایرکت‌ها (نقد افزونۀ Redirection در «مدیریت ریدایرکت با افزونه Redirection» و مقایسه‌شان در «مقایسه افزونه‌های ریدایرکت») — هیچ‌کدام به نال نیازی ندارند.

بازار ایران: مخزن، مارکت، نال

واقعیتِ بازارِ خودمان را بدون رُتُک می‌گویم: تحریم، پرداخت ارزیِ سخت، و قیمت دلاریِ لایسنس‌ها، سه موتوری‌اند که اقتصادِ نال را در ایران زنده نگه داشته‌اند. من کاربرِ ایرانی را سرِ این انتخاب‌ها رها نمی‌کنم؛ نقشۀ واقع‌بینانه:

  • لایهٔ امن (پیش‌فرض): مخزن رسمی + افزونه‌های پولیِ ایرانیِ باسابقه که در مارکت‌های ایرانیِ شناخته‌شده می‌فروشند (سازندۀ ایرانی، پشتیبانیِ فارسی، آپدیتِ واقعی). این لایه، هم قانونی است هم قابل‌پیگیری — اگر سازنده‌ای غیبش بزند، نشانش را دارید.
  • لایهٔ خاکستری: مارکت‌های ایرانی که افزونه‌های پولیِ خارجی را «با لایسنس» می‌فروشند. بعضی‌شان واقعاً اشتراکِ تیمی می‌خرند و آپدیتِ اصلی را تحویل می‌دهند (کارپوشۀ قانونیِ GPL هم استدلالی دارد)؛ بعضی‌شان نالِ بسته‌بندی‌شدۀ همان سایت‌هایِ کرکیِ روسی‌اند. تشخیص؟ از آن‌ها بخواهید فایل را از سازندهٔ اصلی تحویل می‌دهند یا نه، آپدیت را خود سازنده می‌فرستد یا دستی می‌گذارند، و هاش‌شان با نسخۀ رسمی برابری می‌کند؟ هر سه پاسخ روشن = کم‌ریسک؛ «نمی‌دانیم» = نالِ کادوپیچ‌شده.
  • لایهٔ قرمز: سایت‌های «دانلود رایگانِ تمام افزونه‌های پولی» و کانال‌های تلگرامی. همان سه پرونده از این لایه آمد؛ حتی اگر فایلِ «پاک» بدهند، شما را از آپدیت و پشتیبانی بریده‌اند — و افزونه بدون آپدیت، فقط بدافزارِ با تاخیر است.

توصیۀ اقتصادی‌ام برای همین بازار: هر ماه هزینهٔ افزونه‌هایتان را با یک ماه هزینهٔ «پاکسازیِ سایتِ آلوده» (که در بخشِ بعد و در «راهنمای پاک‌سازی سایت وردپرسی هک‌شده» قیمتِ زمانی‌اش را گفته‌ام) مقایسه کنید؛ نال، ارزانش را یک‌بار می‌دهد و گرانی‌اش را هر روز.

اگر نصب کردیم، چه؟

صادقانه: خیلی‌ها این مقاله را در روزِ بدِ خودشان می‌خوانند. اگر به افزونه/قالبِ مشکوک‌تان شک دارید، این توالیِ عملیاتی را انجام دهید — همان کاری که من برای نجاتِ سه سایت کردم:

  1. وحشت نکنید؛ بکاپِ «لحظۀ جرم» بگیرید: قبلِ هر حذف، یک بکاپِ کامل (فایل + دیتابیس) در جایِ امنِ بیرونِ هاست. چرا؟ چون حذفِ افزونۀ آلوده ممکن است سایت را بشکند و برای «فهمیدنِ اینکه چه کرده» به همان وضعیت نیاز دارید؛ این همان قانونی‌ست که در پروتکلِ ساعتِ صفرِ «بهترین افزونه‌های امنیتی وردپرس» توضیح داده‌ام.
  2. اسکنِ لایه‌ای: افزونۀ امنیتیِ بااسکنر (همان مقالۀ امنیتی، بخش Wordfence) + اسکنِ بیرونیِ آفلاینِ کلِ پوشه‌ها؛ دو چشمِ متفاوت،پوششِ بهتری می‌دهد. نشانه‌های آلودگیِ پنهان (تغییرِ تایم‌استمپ فایل‌ها، اکانتِ مدیرِ تازه، ریدایرکت‌های عجیب) را در «چگونه بفهمم سایتم هک شده؟» لیست کرده‌ام.
  3. قطعِ منبع: افزونۀ مشکوک را غیرفعال و حذف کنید — ولی حذفِ از پیشخوان کافی نیست؛ فایل‌هایِ جا‌مانده در wp-content/uploads و جدول‌هایش در دیتابیس را دستی چک کنید (راهنما: «پاک‌سازی بدافزار وردپرس بدون از دست دادن داده»).
  4. چرخهٔ کلیدها: رمزِ همهٔ اکانت‌ها (وردپرس، FTP، دیتابیس، هاست، Gmailِ مدیر) را عوض کنید و sessionهای فعال را ابطال؛ بک‌دورِ باقی‌مانده، رمزهای قدیمی را می‌جوید.
  5. اگر آلودگی عمیق بود، دستِ نانوایی نبرید: در سه پروندهٔ خودم، نه‌تنها افزونه — کلِ هستهٔ وردپرس و آپلود‌ها را از منبعِ پاکِ رسمی بازنصب کردم و دادهٔ سالم (محتوا/تصاویر شناخته‌شده) را برگرداندم. یک‌روزِ کاری وقت می‌برد، ولی «تمیز بودنِ قطعی» را می‌خرد؛ مراحلش را مفصل در «راهنمای پاک‌سازی سایت وردپرسی هک‌شده» نوشته‌ام. بعد از پاکسازی، ردیابیِ آلودگی‌هایِ باقی‌مانده با همان ابزارهای «اسکن بدافزار» و پیشگیریِ لایه‌ای با راهنمای «محافظت وردپرس در برابر هک».
سؤالِ امنِ هر دانلود این نیست «آیا سایت‌شان بزرگ است؟» این است «اگر فردا این افزونه سایت من را خراب کند، کی جواب من را می‌دهد؟» — اگر پاسخ «هیچ‌کس» است، همان پاسخِ سؤالِ اول هم هست.

قالب هم همین‌طور؟

بدونِ تردید — و با خطرِ بیشتر، چون قالب به کلِ نمایش و اغلب به کدهایِ core-override دسترسی دارد. سه پرچمِ قرمزِ اختصاصیِ قالب‌هایِ نال/ارزان: «کدهایِ تبلیغاتیِ تزریق‌شده در footer که حذف‌شان صفحه را می‌شکند»، «ورودیِ پنهان به functions.php تحتِ عنوانِ بهینه‌سازی»، و «آپدیت‌هایِ هفتگیِ بی‌changelog که هر بار فایل‌هایِ تازه اضافه می‌کنند». اگر می‌خواهید قالب بخرید یا انتخاب کنید، فیلترهایِ «چیزهایی که پیش از خرید قالب باید بررسی کنیم» و معیارهایِ «شناسایی قالب استاندارد» را بخوانید؛ و تستِ نهاییِ سالم‌بودن را همان پروتکلِ «بهترین روش تست قالب» اجرا کنید — روی استجینگ، نه روی سایتِ زنده، هرچیز را؛ همان درسِ «تغییر قالب بدون آسیب». رایگان‌هایِ مخزن هم بی‌خطرِ مطلق نیستند؛ «آیا قالب‌های رایگان امن‌اند؟» پاسخِ مستقیمِ همین تردید است.

جمع‌بندی

فرمولِ این مقاله در سه خط: افزونه = کلیدِ سرور، پس فقط از مخزن رسمی یا سازندۀ شناخته‌شده؛ هر «رایگانِ پولی» در اینترنت، یا لایسنس‌شکسته است یا دام؛ و اگر شک کردید، بکاپ → اسکن → قطعِ منبع → چرخشِ رمزها → بازنصبِ هسته به همین ترتیب. قدمِ امشب: کتابخانۀ افزونه‌هایتان را باز کنید و برای هرکدام، سه سؤالِ اولِ فیلترِ هفت‌گانه را بپرسید (مخزن؟ سازنده؟ به‌روز؟)؛ هر سه «نه» = کاندیدِ حذفِ همین هفته. تجربه‌تان از پروندۀ آلودگیِ خودتان یا دیدۀ «افزونۀ نالِ همسایه» را در دیدگاه بنویسید — فهرستِ پرچم‌های قرمز را با نمونه‌هایِ واقعیِ جامعه کامل می‌کنم. 🔐