ما هو السبام ولماذا يستخدم وكيف يعمل مع مجموعة من الطرق للتخلص منه برمجيا

14-09-2013 ASP.NET | Programming
إعلان

عند الشروع في بناء مدونة أو موقع شخصي يسمح بتفاعل المستخدمين من خلال صندوق التعليقات أو غيره "لا يطلب أن يكون المستخدم عضوا" فإن أول ما عليك أن تخشاه هو السبام, يعتبر كابوس لأصحاب المواقع والمدونات, يقتحمها ويقوم بتعبئة النماذج بمعلومات وهمية وتقديمها على أنها من مستخدمين حقيقيين, أذكر مرة أني دخلت مدونتي وفوجئت بأكثر من 130 تعليق ينتظر الموافقه, للوهلة الأولى ظننت أن إعدادات SEO والروابط قد آتت أُكلها, وأن جوجل قد أعد لي خوارزمية بحث خاصة بمدونتي, شعرت بلذة التدوين, ولكن ذلك لم يدم طويلا, فما إن قمت بفتح التعليقات لأقوم بالموافقه عليها أتفاجئ أني لم أفهم أي كلمة منها, لم أعلم ما العلاقة التي تربط التعليق بمحتوى التدوينة ! أقول أني قد قمت بإنشاء نظام تدوين متكامل من خلال ASP.NET MVC 3  مع بعض snapshots للمشروع لأجد أن التعليق يخبرني أن خدمة Rss ليست فعالة على الموقع كما أني إستخدمت الطريقة التي أخبرتني عنها ولم تنجح, إنتظر قليلا ! ما الطريقة التي أخبرتك عنها ! ثم من أنت ! إسمك غريب جدا ولا يعتبر مألوف لي بالإضافة إلى أني لا أستطيع قراءته ! والعديد العديد على هذه الشاكلة.

advanced_blog_spam1

قمت بحذف كافة التعليقات بشكل يدوي وما هي إلا ساعات معدوده حتى أعيد نفس السيناريو ليحكي لي قصص وأساطير لم أسمع بها من قبل, كإجراء مبدئي قمت بإغلاق التعليقات في تلك الفترة على كافة المواضيع في المدونة وارتحت من عدم وجود التعليقات المزعجة لفترة لا بأس بها, ولكن ما فائدة المدونة بدون تعليقات ! أي شخص يدون يحب أن يرى اراء الناس وتعليقاتهم حول ما يكتب عنه, لا فائدة من وجود مدونة من دون تعليقات, فوجود التعليقات في التدوينة يحفز المدون على الإستمرار في الكتابة من دون كلل أو ملل لأنه وبالنتيجة يعرف أن هناك من يقرأ ما يكتبه ويتفاعل معه ويستفيد منه بل ويشاركه ارائه في الموضوع, بحثت عن Plugin لفلترة التعليقات ولم أجد سوى aksimet والذي بدورة بحاجة الى دفع مبلغ لا بأس به, بحثت عن بديل فوجدت Comment math plugin , أمر مزعج أن تضع للزائر صندوق يقوم بوضع حاصل جمع العدد 2 مع العدد 8 وفي بعض الأحيان يتطور الأمر لتقول له ضع 10 ! لم أحب هذا النوع من الإضافات حتى ولو كان الأمر على حساب الجهد المبذول في حذف التعليقات, قمت بعدها بإضافة delete pending comments plugin, كان الأمر جميلا, يمكنك حذف كافة التعليقات قيد الإنتظار "Pending" بزر واحد, أعجبني واستخدمته لفترة حتى اكتشفت أني أقوم بحذف تعليقات الزوار أيضا, قمت بعدها بإضافة Facebook Plugin لأتفادى هذه المشكلة والحمدلله كانت الإضافة ممتازة مع ملاحظتي لعدم وجود أشخاص كثر يفضلون إستخدامها وبعدها إنشغلت في بضعة مشاريع ولم أكن أملك الوقت الكافي لإدارة المدونة ولكتابة شيئ جديد !

حاليا وبعد بناء نظام التدوين الخاص بي "PAGER" لم يعد بالإمكان الإعتماد على الإضافات الموجودة في برامج إدارة المحتوى لذلك قررت أن أبحث في موضوع السبام, كيف يعمل وما الهدف منه وكيف يمكن التخلص منه, جمعت معلومات لا بأس بها وأود مشاركتها معكم.

SPAM البريد المزعج : أو البريد الغير مرغوب به, وهو إرسال كم كبير من البريد الإلكتروني إلى المتلقين دون الطلب منهم بهدف الترويج لفكرة أو سلعة أو معلومة معينة دون أي إعتبار لخصوصيات الاخرين, يتم هذا الأمر من خلال برامج تدعى robots تقوم بالتجوال في مواقع الإنترنت وفلترة عناوين البريد وحفظها ليتم وضعها في قوائم الإرسال الإعلانية.

كان الأمر بداية مقتصر على إرسال رسائل بريدية مزعجة بهدف الإعلان بأقل تكلفة ولكن الأمر لم يدم طويلا إلا أن تطور ليصل إلى المدونات وساحات الحوار التي لا تتطلب من المستخدم أن يكون مسجلا لديها, حسنا إذا كان الهدف من إرسال البريد المزعج هو الإعلان بأقل تكلفة إذن لماذا تطور الأمر ليصبح على شكل تعليقات وهمية تزعج أصحاب المواقع ؟

لم يستخدم السبام 

يرجع هذا الأمر إلى عدة سنوات عندما قررت محركات البحث وعلى رأسهم شركة جوجل إستخدام مبدأ PageRank لتنظيم نتائج البحث "أولوية الصفحة بالظهور تعود إلى عدد المواقع التي تحتوي رابطا لتلك الصفحة", كان الأمر رائعا وبدأ يعود بنتائج بحث دقيقة ولكن هناك بعض الأشخاص بدأو باستخدام أسلوب google bombing.

فلنفرض أنك في إحدى صفحات موقعك الشخصي تتحدث عن سلعة معينه ولتكن "موبايل" وتريد أن تظهر صفحتك في النتائج الأولى للبحث عندما يقوم أحدهم بالبحث عن كلمة موبايل, تقوم بنشر رابط الصفحة على عدد كبير من المواقع وبالتالي سيزداد PageRank الخاص بصفحتك وستظهر في النتائج الأولى للبحث, وهذا ما يفعله السبامرز "Spammers".

طورت برامج السبام لتصبح أكثر ذكاء بحيث لا يمكن ملاحظتها, فسابقا كان من السهل تمييز السبام من غيره ففي موضوعك ولنفرض جزاف أنك تتحدث عن رحلة إلى القمر, وإذا بأحد التعليقات تتحدث عن "موسم تزاوج البط !", فعليا لا علاقة للموضوع بالتعليق وبالتالي سيكون من السهل تمييز إذا ما كانت هذه الرسالة سبام أم لا, ولكن حديثا أصبحت التعليقات قريبة من الموضوع وبعض الأحيان تطرح تعليقات مناسبة جدا لها علاقة وطيدة بالموضوع, في هذه الحالة من الصعب أن تميز ما إذا كان التعليق سبام أم لا, لا تدخل على الرابط المرفق بالتعليق, إذا كنت تشك من أن هذا التعليق سبام أم لا كل ما عليك القيام به هو تعديل التعليق وحذف الرابط ومن ثم الموافقة عليه, ستحظى بتعليق وستمنع السبامر من تحقيق هدفه.

كيف يعمل السبام 

السبام لم يعد مقتصرا فقط على البريد الإلكتروني بل أصبح يغزو المواقع ويقوم بتعبئة النماذج بشكل ألي وتقديمها ليصبح لديك مئات التعليقات الوهمية, الـسبامرز يعتمدون على برامج تدعى robots تقوم بالتجوال عبر الإنترنت بحثا عن نماذج Forms في الصفحات لتقوم بتعبئتها وتقديمها بشكل الي.

كأشخاص لا يمكننا التمييز بين السبام وغيره إذا لم تكن هناك شبهات حول محتوى التعليق, ولكن برامجنا قادرة على فعل ذلك لأنها تحصل على معلومات أكثر مما نعرفه عن أي زائر يدخل الموقع لذلك نقوم بإستغلال هذه البيانات في تحديد طبيعة التعليق إذا كان سبام أم لا.

كيف تتخلص من السبام

stop_spam_sign

إنحسار التعليقات بالمستخدمين المسجلين في المدونة فقط هو أفضل الحلول في مواجهة السبام بإعتبار أن هذا المستخدم هو موثوق ولكن ليس عمليا, كصاحب مدونة لا يمكنني أن أطلب من الزائر التسجيل ليقوم بالتعليق فكل ما يريده هو إضافة تعليق ومن المنطقي أن لا يتطلب هذا الأمر خطوات معقدة  فطلب التسجيل في المدونة لإضافة تعليق من احد الاسباب التي تمنع تفاعل الاخرين مع مواضيعك, ولكن لا تقلق هناك بعض الحلول ستفي بالغرض ولا تتطلب أن يكون المستخدم عضو في الموقع.

registerforcomment

كابتشا - Captcha

recaptcha-example

وهي صورة تظهر للمستخدمين يمكنهم تمييز حروفها بسهوله ولكنها معقدة جدا بالنسبة لـ robotics software والحاسوب بشكل عام, تستخدم Captcha في تحديد إذا ما كان الشخص الذي يقوم بتعبئة النموذج Forms بشريا أم مجرد robot يقوم بتعبئة المعلومات بشكل آلي, تستخدم captcha في أسفل النماذج لتقوم بتعبئتها بالكلمة الموجوده في الصورة للتأكد أنك إنسان ولست robot.

سأقوم في وقت لاحق بوضع درس يتعلق حول إستخدام Captcha داخل تطبيقاتك من خلال ASP.NET

شخصيا لا أفضل هذه الطريقة لذلك لم أكتفي بالبحث إلى هذه المرحلة, فضلت أن أقوم بإيجاد طرق أكثر ذكاء من مجرد وضع Captcha داخل نموذج التعليق التي في معظم الأحيان تكون قرائتها عبارة عن أحجية بحد ذاتها لذلك وجدت أسلوب اخر أكثر عملية وراحة للمستخدم ولكن أقل فاعلية من Captcha.

فرق الوقت بين تحميل الصفحة وتقديم النموذج

page-load-speed-2

المستخدم العادي سيقوم بالدخول إلى الصفحة وينتظرها لكي يتم تحميلها بالكامل ثم سيقوم بالنزول قليلا لقراءه المحتوى وبعدها يقرر ما إذا كان سيقوم بالتعليق أم لا, ثم إن تعبئة نموذج التعليقات يأخذ وقتا أيضا على عكس الروبوتس فهي تقوم بتحميل الصفحة وعمل تجزئه لها لمعرفة مكان النموذج ثم تقوم بتعبئته وتقديمه بشكل سريع جدا, من خلال هذه النقطة يمكننا أن نحدد ما إذا كان المعلق سبامر أم لا, ولكن كيف نقوم بها ؟

يمكننا فعل ذلك من خلال إنشاء Cookies بمجرد أن ينتهي المتصفح من تحميل الصفحة, نقوم بوضع الوقت الحالي بداخله, وعند قيام أي شخص بالتعليق وتقديم النموذج نقوم بطرح وقت إكتمال تحميل الصفحة من وقت تسليم النموذج "submit" فنحصل على قيمة معينه ولتكن 20 ثانية ! بالتأكيد لن يقوم بفعل ذلك أي شخص, لا يوجد من يقوم بقراءة الموضوع والتعليق عليه خلال 20 ثانية, هذا روبوت, ولكن لو حصلنا على فرق في الزمن بمقدار 5 دقائق يبدو هذا منطقيا أكثر لأن يقوم أي شخص بفعله, وبهذا الأسلوب تتمكن من معرفة الروبوتس من البشر.

إستخدام الكاش لمنع الطلبات المتكرره 

caching-architecture

في بعض الأحيان تقوم الروبوتس بملئ النموذج وتقديمة أكثر من مره خلال فترة زمنية قصيره, في المثال السابق كنا قد منعنا الروبوتس من القيام بتقديم أي نموذج قبل مده معينه, ولكن هنا سنسمح لها بتقديم طلب واحد فقط ضمن مده معينه وبعد ذلك نقوم بحفظ البيانات المتعلقة بالمستخدم مثل IP,Agent في الكاش لمدة زمنية معينة وفي حال وصول أي طلب جديد نقوم بإحضار البيانات مرة أخرى ومن ثم نقارنها بالقيم الموجوده داخل الكاش, إذا كانت موجوده فيجب عليه الإنتظار قليلا حتى تنتهي الفترة وبعدها يمكنه إعادة تقديم الطلب مرة أخرى, تماما مثل المنتديات فعند قيامك بالبحث عن شيئ داخل المنتدى وأردت المحاولة مجددا تجده يخبرك بأن عليك الإنتظار لمدة معينه قبل المحاولة من جديد, يمكنك إستخدام الكود التالي في حال كنت تستخدم ASP.NET MVC في بناء تطبيقك.

public class SpamFilter :ActionFilterAttribute
{
        public int Delay = 10; //time in seconds 
        public string ErrorMessage = "الرجاء الإنتظار قليلا";

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            var cache = filterContext.HttpContext.Cache;
            var info = request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? request.UserHostAddress;
            info += request.UserAgent;
            var target = request.RawUrl + request.QueryString;

            var hash = String.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(info + target)).Select(x => x.ToString("x2")));
            if (cache[hash] != null)
            {
                filterContext.Controller.ViewData.ModelState.AddModelError("ExcessiveRequests", ErrorMessage);
            }
            else
            {
                
                cache.Add(hash, "", null, DateTime.Now.AddSeconds(Delay), Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
            }
            base.OnActionExecuting(filterContext);
        }
}

ولكي تجبر أي Action بإتباع التعليمات السابقة نضيف إسم الفئه Class في الأعلى بنفس أسلوب Data Annotations

[HttpPost]
[SpamFilter(Delay=10)]
public ActionResult Index()
{
            if (ModelState.IsValid)
            {
                return Content("تم بنجاح");
            }
            else
            {
                return Content("نأسف, هناك فترة معينة عليك انتظارها");
            }
}

form1

وبعد تقديم النموذج مرتين بفارق زمني قصير كانت النتيجة كالتالي :

faild

قمت بإرفاق ملف يحتوي على FilterSpam Class وأيضا على المتحكم homeController وأيضا View خاصة بـ Index Action, يمكنك تحميلها وإرفاقها بمشروعك للقيام بتجربة عملية

إخفاء حقل من خلال CSS

css_logo

من المعروف أن الروبوتس تقوم بملئ كافة البيانات الموجوده داخل النموذج وتقديمها مباشرة, هي لا تميز بين الحقول المطلوب تعبئتها أو لا, بعضها متطور وربما يعلم أن هذا الحقل من نوع hidden لذلك لا يجب عليه تعبئته, ولكن ماذا لو قمنا بإضافة حقل عادي وقمنا بإخفاءه من خلال CSS ؟

الفكرة من هذه الطريقة هو قيامك بوضع حقل ومن ثم إخفاءه من خلال كودات CSS وعند تقديم الطلب إذا وجدت هذا الحقل يحتوي على قيمة فمن المؤكد أن الروبوت هي من قامت بذلك وبهذا تستطيع رفض الطلب بعد أن تبين أنه سبام, المستخدمون العاديون لن يلاحظو وجود هذا الحقل لأنه مخفي invisible لذلك لن يقومو بملئه وبهذا الأسلوب تستطيع التخفيف من المدخلات الوهمية.

يمكنك إستعمال هذه الخدعة لأخفاء حقل نصي معين داخل الفورم بدل من إستخدام النوع hidden field يمكنك إخفاءه من خلال CSS

invisible-css

بعد ذلك يمكنك تعين خاصية class للحقل المراد إخفاءه من خلال .

codehtml

يمكنك تحميل ملف الصفحة من هنا 

طرق أخرى

الطرق الموجوده في الأعلى هي طرق برمجية تستخدمها في حال كنت ترغب ببناء مكون التعليقات بيدك, ولكن هناك أيضا عدد من الحلول التي يمكنك الإعتماد عليها في إدارة التعليقات الخاصة بك على المدونة, يمكنك إضافة Facebook Comments Plugin إذا كنت ترغب من المعلقين إستخدام حساباتهم على Facebook في الزوار مع أن عدد لا بأس به من المعلقين لا يفضلون هذه الطريقة.

disqus

شخصيا إستخدمت إضافة من Disqus تقوم بالسماح للزوار بالتعليق بتوفير عدد من مواقع التواصل الإجتماعي لإستخدامها في التعليقات إضافة إلى Facebook, فهناك Google+ و Twitter و Disqus, وأيضا هناك خاصية التعليق كزائر إذا كنت لا ترغب بإستخدام أي من الخيارات المتاحة.

disqus-panel

توفر لك الإضافة لوحة تحكم لإدارة التعليقات على موقعك الإلكتروني من تعديل وحذف, والجميل أيضا أنها توفر لك أخذ نسخة إحتياطية من التعليقات, فلو أردت التخلي عنها وبناء نظام تعليقات خاص بك يمكنك أخذ نسخة من التعليقات وإضافتها على قاعدة البيانات الخاصة بك !

هل لديك طرق أخرى لتفادي السبام ؟ شاركنا بها !

ابحث حاليا عن خدمة مميزة في مجال النشرات البريدية تمكنني من إدارة قوائم البريد بدل من بناء واحدة جديدة من الصفر وحتى لو أضطر الأمر للدفع مقابل ذلك, في الحقيقة مقدمين النشرات البريدية أفضل في هذا المجال وذلك لأنهم يضمنون لك وصول رسائلك على صندوق الوراد inbox بدل من إعتبارها سبام أيضا :)

عن محمد جمال

مهندس حاسوب ومطور برمجيات, أعمل Freelancer في تطوير تطبيقات الويب من خلال ASP.NET منذ عام 2007 قمت بإنشاء عدة مشاريع في مجالات مختلفة (المتحكمات الدقيقة, الأنظمة المضمنة, الروبوت, برامج سطح المكتب, أنظمة قواعد البيانات) ومن هواياتي الخط العربي

subscribe

إعلان
إعلان
blog comments powered by Disqus

تنويه : الأراء في هذا الموقع شخصية ولا تبت لأحد بصلة تحت أي حال من الأحوال