تصویر محمدعلی اکبری

قبل‌تر مطلبی با عنوان "مبارزه با اسپم‌ها به صورت دستی در دروپال" منتشر کردم که در انتهای آن چند کوئری برای پاک سازی پایگاه داده از اسپم‌های ایجاد شده بر روی کامنت را آمده است.

حالا تصور کنید موجودیت (Entity type) دیگری در دروپال مبتلا به اسپم شده است. به عنوان مثال تیکت‌های درخواست پشتیبانی دچار این مشکل شده است. و یا تعداد بسیار زیادی کاربر توسط روبات‌ها تولید شده‌اند.

برای حذف این موجود‌ها (Entities) می‌توان به سه روش عمل کرد.

  1. حذف و عدم ساخت مجدد موجود جدید توسط devel generate
  2. حذف موجودها توسط ماژول Delete all
  3. اجرای چند کوئری روی پایگاه داده و انجام عملیات پاکسازی به صورت دستی.

برای اجرای روش سوم موجودیت "درخواست پشیبانی" که یک نوع محتوا است و توسط ماژول Support در دروپال ایجاد می‌شود را مورد نظر قرار می‌دهیم. این ماژول بخاطر ماهیت آن می‌تواند در دسترس کاربران غیر عضو نیز قرار گیرد. پس روبات ها به سادگی به فرم ایجاد گره (Node) جدید دسترسی دارند و میتوانند روی ان اسپم تولید کنند. لذا اگر توسط مازولهایی مانند Captcha جلوی آن را نگیریم ممکن است درگیر اسپم شویم.

گام اول: شناسایی جداولی که باید پاکسازی شوند

  1. می‌دانیم درخواست پشتیبانی به صورت یک گره در دروپال ذخیره می‌شود. لذا جدول node و به تبع آن جدول نسخه‌بندی آن node_revision نیز حاوی اطلاعات اسپم هستند.
  2. همچنین هر گره می‌تواند دارای چند فیلد باشد (که باید آنها را از جدول field_config_instance کشف کنیم). لذا تعدادی از جداول مربوط به فیلدها و جداول معادل نسخه‌بندی آنها نیز باید پاکسازی شوند.
  3. اگر فیلدهای مذکور از نوع فایل یا تصویر باشند، جداول file_managed و file_usage نیز احتمالا مبتلا به اطلاعات اسپم هستند.
  4. دو جدول node_access و node_comment_statistics که شامل اطلاعات آماری هستن نیز باید پاک‌سازی شوند.
  5. جداول مربوط به جستجو search_dataset و search_index نیز شامل اطلاعات از پیش پردازش شده‌ای برای جستجوی سریع‌تر هستند که باید پاکسازی شوند.
  6. در نهایت جداول cache به عنوان مثال cache_field نیز باید خالی شوند.

گام دوم: اجرای عملیات پاکسازی

کوئری‌های زیر مراحل 1 تا 7 را پیاده‌سازی می‌کند. تقدم و تاخیر اجرای کوئری‌ها مهم است. زیرا اطلاعات به صورت زنجیروار به هم وابستگی دارند. برای حذف همه اطلاعات باید زنجیره را درست و به ترتیب طی کنیم.

کشف فیلدها:

SELECT DISTINCT field_name FROM `field_config_instance` WHERE entity_type = 'node' AND bundle = 'support_ticket'

خروجی: فیلدهای body و support_ticket_upload

حذف اطلاعات مربوط به فیلدها:

DELETE FROM `field_data_body` WHERE entity_type = 'node' AND entity_id IN ( SELECT nid FROM `node` WHERE type = 'support_ticket' );
DELETE FROM `field_revision_body` WHERE entity_type = 'node' AND entity_id IN ( SELECT nid FROM `node` WHERE type = 'support_ticket' );
DELETE FROM `field_data_support_ticket_upload` WHERE entity_type = 'node' AND entity_id IN ( SELECT nid FROM `node` WHERE type = 'support_ticket' );
DELETE FROM `field_revision_support_ticket_upload` WHERE entity_type = 'node' AND entity_id IN ( SELECT nid FROM `node` WHERE type = 'support_ticket' );

حذف اطلاعات آماری و دسترسی مربوط به گره‌ها:

DELETE FROM `node_access` WHERE nid IN ( SELECT nid FROM `node` WHERE type = 'support_ticket' );
DELETE FROM `node_comment_statistics` WHERE nid IN ( SELECT nid FROM `node` WHERE type = 'support_ticket' );

حذف اطلاعات پردازش شده برای جستجو:

DELETE FROM `search_dataset` WHERE sid IN ( SELECT nid FROM `node` WHERE type = 'support_ticket' );
DELETE FROM `search_index` WHERE sid IN ( SELECT nid FROM `node` WHERE type = 'support_ticket' );

حذف اطلاعات مربوط به فایل‌ها:

 

 

حذف گره‌ها:

DELETE FROM `node` WHERE type = 'support_ticket';
DELETE FROM `node_revision` WHERE type = 'support_ticket';

خالی کردن حافظه نهان:

DELETE FROM cache;
DELETE FROM cache_field;

 

 

 

 

 

دیدگاه‌ها

تصویر امیر مهدی سرشار

امیر مهدی سرشار

سلام
قسمت "تماس با ما" رو پیدا نکردم،
لطفا در مورد استفاده از CDN در دروپال نیز توضیحاتی بفرمایید.
آیا برای آپلود فایل ها در دروپال می توان از هاست دیگری به غیر از هاست اصلی استفاده نمود؟

تصویر محمدعلی اکبری

محمدعلی اکبری

سلام، اگر منظورتون CDN خاصی هست باید بررسی کنید integration اون با دروپال وجود داره یا نه؟ در غیر این صورت ماژول Storage API با سرویس‌های مختلفی که داره می‌تونه جواب مورد نظر شما باشه.

افزودن نظر جدید