هل يمكن ايجاد طريقة تمنع المستخدم من التصويت لاكثر من مرة ؟
هناك الاستفادة من (السيشن - الكوكيز - رقم ال ip ) لكن هذه الطرق يمكن تجاوزها فهل يوجد طريقة او خوارزمية متقدمة ؟
أن يكون التسجيل عبر شيء مكلف (من حيث الجهد أو المال) للمستخدم مثلا عبر رقم بطاقة إئتمان يتم سحب دولار (أقل مبلغ ممكن) منها للتأكد من هوية صاحبها (هذه الطريقة مستخدمة في التحقق من المطورين في itunes و google play وكذلك عند التسجيل في أمازون)
قد يكون التسجيل عبر فيسبوك أو google plus أو تويتر أو open id مكلف كفاية في الكثير من الحالات.
قد يكون التسجيل عبر البريد خيارا لولا خدمة
فلنفرض ان المطلوب تقييمه (مقالة)
اذا كان الشخص مسجل في قاعدة البيانات أو (بحساب اجتماعي)
بدون تسجيل أكاد أجزم ان لا طريقة سليمة لذلك
الطرق كثيرة، و في النهاية ترجع لأهمية و قيمة التصويت.
من الطرق التي تم ذكرها
استخدام قاعدة البيانات لحفظ التصويتات: هذه أفضل طريقة و سهلة التطبيق. تستطيع وضع قيود على التصويت، مثلا لا يستطيع العضو الجديد التصويت مالم يكن له أكثر من س نقطة و\أو تاريخ الانضمام للموقع أكثر من ص يوم. بيحث مثلا ص أكبر من تاريخ اليوم الذي تم في إضافة التصويت. و مثلا تستطيع وضع قيد كـ وجوب ايجاد ايميل من gmail أو htmail أو yahoo. مع أن آخر قيد يمكن بسهولة تفاديه بتسجيل ايميل جديد. لكن هذا القيد سيقلل من عمليات التسجيل لأنه يجعل عملية التسجيل بأكثر من حساب مملة و مهلكة و تأخذ الكثير من الوقت. و الطريقة وضعها أخي اسلام IAli في رده.
استخدام شبكة اجتماعية من أجل تسجيل حساب: هذه أفضل طريقة* لكن تطبيقها قد يكون أطول و أصعب من الطريقة الأولى. تحتاج مكتبات لتسجيل شخص في موقعك باستخدام الشبكات الإجتماعية أو تحتاج لبرمجتها أنت. لذا، تطبيق هذه الطريقة يحتاج الكثير من الوقت. إذا مثلا تستخدم Rails تستطيع استخدام مكتبة devise و إذا كنت تستخدم nodejs تستطيع استخدام passport. لكن مثل الطريقة الأولى، أستطيع و بسهولة إنشاء حساب آخر في الفيسبوك أو تويتر للتصويت. مثلا لدي حاليا 3 حسابات تويتر و أستطيع التصويت 3 مرات. تستطيع استخدام قيود أخرى هنا مثل: عدد المتابعين معين، تاريخ التسجيل، أكثر من س status ...
mac address: في علم الشبكات، مهما كان mac address الذي تستقبله، لم يكون عنوان كمبيوتر المستخدم إلا إذا كان موصول بخادم موقعك بشكل مباشر، أعني سلك الشبكة من جهازه موصول بمنفذ شبكة الخادم. عدى عن ذلك، الـ mac address يتغير في كل مرة يمر فيها الطلب بين جهازين (سوييتش، راوتر، خادم، ... ) عبر الشبكة.
استخدام ip: للأسف الطريقة هذه ليست فعالة. يوجد مبدأ في الشبكات اسمه NAT. باختصار، حاول معرفة رقم IP من جهازك و من جهاز آخر في نفس شبكتك. الاثنين لهم نفس العنوان. إذا استخدمت هذه الطريقة و صدف أحد الأعضاء قام بالتصويت في موقعك و حاول شخص آخر في نفس الشبكة التصويت على نفس الموضوع، الطريقة هذه ستمنعه من التصويت لأنه الـ IP مسجّل لتصويت قبله.
cookies و session: الـ cookies تستطيع حذفها بسهولة. و مع session صحيح أنها على طرف الخادم بدلا من المستخدم، لكن هل تعلم أن الـ session لن يعمل ما لم يتم ربطه بالمستخدم؟ و هل تعلم ما طريقة الربط؟ cookie :) . إذا بسهولة، أحذف الـ cookie و الخادم سيعين لي session جديدة و أستطيع التصويت من جديد. مثلا في .NET تستطيع الاعتماد على URL بدلا من cookie، و هذه حلها بسيط، رابط جديد.
عبر الهاتف: لدي صديق لديه 3 هواتف. و آخر لديه 2. و الشرائح تباع في كل مكان و تكلفتها جدا رخيصة.
ترى كيف تتصرف المواقع الكبيرة و مواقع الأخبار و الصحف العالمية مع هذه المشكلة ؟
من قال لك أنها محلولة :)؟
التصويت للأعضاء
في جدول الأعضاء، قم بإضافة تاريخ التسجيل و إذا أحببت قم بإضافة جدول و سمّه activities
إذا العضو صوّت للموضوع، يتم إضافة التصويت لجدول التصويتات و إضافة سجل إلى جدول activities. إذا العضو صوّت قبل هذه المرة، لا تسجّل تصويته الجديد. و لو أحببت، تستطيع إظهار تصويته للموضوع عند فتحه للموضوع. يعني إذا صوّت في الماضي فيظهر له أنه قام بالتصويت. صحيح تعتبر إضافة على استعلام قاعدة البيانات و لكنك توضح للعضو ما إذا صوّت أم لا. أغلب مشاريعي أوضح للعضو تصويته.
التسجيل في الموقع سهل. ايميل و كلمة سرية.
العضو يستطيع زيارة المواضيع لكن لا تسجل أي نشاط له (تصويت أو رد) إلا إذا قام بالتفعيل بالضغط على رابط تفعيل في ايميل مرسل
إذا الشخص قام بالدخول على موضوع، سجّل دخوله لـ activities مع ذكر رقم الموضوع
استخدم worker أو cron job للمرور على آخر الـ activities للتحقق من أنشطة شبيه لحسابات مختلفة. إذا وجد أي تشابه معناه يوجد شئ مريب تستطيع في هذه الحالة تغيير حالة الحساب من "سليم" إلى "مشكوك في أمره" و اجعله يدخل captcha في كل مرة يصوّت فيها. أو تستطيع حذف الحساب الآخر و كل تصويتاته
إذا التصويت جدا مهم، تستطيع ربط كل حساب برقم، مثلا رقم بطاقة جامعية أو هوية مدنية أو رقم جواز السفر .... و قد ذكرها أحد الإخوة هنا. لا تستعمل بطاقة ائتمانية لأن الحصول على مجموعة سهل.
لماذا لا أنصح بالطريقة أعلاه؟ طويلة، مملة لك كمبرمج، مهلكة لموارد الخادم، و في النهاية التصويت قد يكون عنصر صغير في برمجيتك و لا تحتاج للصداع :)
الطريقة التي أنصح فيها؟ طريقة الأخ IAl. العضو قد يكون عضو مسجل في موقع بايميل و كلمة سرية أو عن طريق شبكة اجتماعية كما ذكر alsadi.
إن كنت تقصد بأكثر من شخص الجهاز نفسه فيمكن بالإستعانة بالـ mac address فهو ثابت غير متغير نهائياً لو عمل تنزيل لنظام آخر كلياً
فكرة رهيبة لم تخطر على بالي
لا اقصد mac address تحديدا لكن الاستفادة من معلومات العتاد بشكل عام
استفدت منها في حماية برامج لكن لم افكر باستخدام هذه الفكرة في مجال الويب
على فكرة تطبيق الفكرة ليس سهل و لا تستخدم العديد من المواقع العالمية هذه الطريقة رغم اني اعتقد انها طريقة فعالة بشكل كبير
شكرا لردك
1- نظام عضويات مع تأكيد صحة البريد و منع إعادة التسجيل عبر ip و cookies و sessions
2- تأكيد التصويت عبر شريحة التليفون , حيث يتم تأكيد الصوت المطلوب عبر إرسال كود إلى الهاتف و بإدخال هذا الكود يكون الصوت صحيح .
3- منع إعادة التصويت عبر ip و cookies و sessions
مكلف لكن لا يمكن التلاعب بدرجة كبيره :)
او يمكنك استخدام احد المنصات المجانية حيث بعدما تقوم بعمل الاستبيان يعطيك سكريبت تضعها فى الموقع.
التعليقات