سؤال

ما هي أفضل طريقة لإيقاف الروبوتات والمستخدمين الضارين وما إلى ذلك؟من تنفيذ البرامج النصية php بسرعة كبيرة؟هل هو موافق إذا كنت تستخدم usleep() أو sleep() وظائف ببساطة عدم القيام "بأي شيء" لفترة من الوقت (قبل تنفيذ التعليمات البرمجية المطلوبة مباشرة)، أم أن هذا غبي تمامًا وهناك طرق أفضل لذلك؟

مثال:

function login() {
 //enter login code here
}

function logout() {
 //enter logout code here
}

إذا وضعت فقط، أقول، usleep(3000000) قبل رموز تسجيل الدخول والخروج، هل هذا جيد، أم أن هناك طرقًا أفضل وأكثر حكمة لتحقيق ما أريد تحقيقه؟

يحرر: بناءً على الاقتراحات أدناه، يتم ذلك usleep أو sleep هل يتسبب فقط في فصل المعالج عن البرنامج النصي الحالي الذي يتم تنفيذه بواسطة المستخدم الحالي، أم أنه يتسبب في فصله عن الخدمة بأكملها؟أي.إذا قام مستخدم + برنامج نصي باستدعاء ملف sleep/usleep, هل سيتم تأخير جميع المستخدمين المتزامنين + البرامج النصية أيضًا؟

هل كانت مفيدة؟

المحلول

الطريقة التي تعمل بها معظم خوادم الويب (Apache على سبيل المثال) هي الحفاظ على مجموعة من سلاسل العمليات.عند تنفيذ برنامج PHP النصي، يقوم مؤشر ترابط واحد بتشغيل برنامج PHP النصي.

عندما يفعل البرنامج النصي الخاص بك sleep(100), ، يستغرق تنفيذ النص 100 ثانية.وهذا يعني أن خيط العامل الخاص بك مقيّد لمدة 100 ثانية.

المشكلة هي أن لديك عددًا محدودًا جدًا من سلاسل العمليات - لنفترض أن لديك 10 سلاسل رسائل، وقام 10 أشخاص بتسجيل الدخول - والآن لا يمكن لخادم الويب الخاص بك تقديم أي استجابات أخرى..

أفضل طريقة لتحديد معدل تسجيلات الدخول (أو الإجراءات الأخرى) هي استخدام نوع ما من أدوات التخزين السريعة في الذاكرة (com.memcached مثالي لهذا)، ولكن ذلك يتطلب تشغيل عملية منفصلة وهو أمر معقد للغاية (يمكنك القيام بذلك إذا كنت تقوم بتشغيل شيء مثل Facebook..).

بشكل أبسط، يمكن أن يكون لديك جدول قاعدة بيانات يتم تخزينه user_id أو ip_address, first_failed و failure_counter.

في كل مرة تحصل فيها على معلومات تسجيل دخول فاشلة، ستفعل (في رمز زائف):

if (first_failed in last hour) and (failure_counter > threshold):
    return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
    increment failure_counter
else:
    reset first_failed to current time
    increment failure_counter

ربما ليست الطريقة الأكثر كفاءة، وهناك طرق أفضل، ولكن يجب أن تتوقف عن التأثير الغاشم بشكل جيد.استخدام memcached هو نفسه في الأساس، ولكن يتم استبدال قاعدة البيانات بـ memcached (وهو أسرع)

نصائح أخرى

لإيقاف الروبوتات والمستخدمين الضارين، وما إلى ذلك.من تنفيذ البرامج النصية php بسرعة كبيرة؟

أود أن أسأل أولاً ما الذي تحاول حقًا منعه؟إذا كان الأمر يتعلق بهجمات رفض الخدمة، فيجب أن أقول إنه لا يوجد شيء يمكنك القيام به إذا كنت مقيدًا بما يمكنك إضافته إلى نصوص PHP النصية.إن الحالة الفنية تتجاوز بكثير ما يمكننا كمبرمجين الحماية منه.ابدأ بالنظر إلى أدوات مسؤول النظام المصممة لهذا الغرض.

أم أنك تحاول الحد من خدمتك حتى يتمكن الأشخاص الحقيقيون من الوصول إليها ولكن الروبوتات لا تستطيع ذلك؟إذا كان الأمر كذلك، فسألقي نظرة على بعض تقنيات "captcha".

أم أنك تحاول منع المستخدمين من استطلاع موقعك كل ثانية بحثًا عن محتوى جديد؟إذا كان الأمر كذلك، فسأقوم بالتحقق من توفير موجز RSS أو أي طريقة أخرى لإعلامهم حتى لا يلتهموا النطاق الترددي الخاص بك.

أو انه شيء اخر؟

بشكل عام، أود أن أقول لا النوم () ولا usleep () وسيلة جيدة.

ستجبر الطريقة المقترحة جميع المستخدمين على الانتظار دون داع قبل تسجيل الدخول.

تم تكوين معظم خوادم LAMP (ومعظم أجهزة التوجيه/المحولات في الواقع) لمنع هجمات رفض الخدمة.يفعلون ذلك عن طريق رفض طلبات متتالية متعددة من نفس عنوان IP.

لا ترغب في وضع وضع السكون في ملف php.سيؤدي القيام بذلك إلى تقليل عدد الطلبات المتزامنة التي يمكن لخدمتك التعامل معها بشكل كبير نظرًا لأنه سيكون لديك اتصالات مفتوحة في انتظارها.

تحتوي معظم خوادم HTTP على ميزات يمكنك تمكينها لتجنب هجمات DoS، ولكن إذا فشلت في ذلك، فيجب عليك فقط تتبع عناوين IP التي شاهدتها مرات عديدة مؤخرًا وإرسال رسالة 403 Forbidden إليهم مع رسالة تطلب منهم الانتظار لمدة ثانية.

إذا لم تتمكن لسبب ما من الاعتماد على كون REMOTE_ADDR خاصًا بالمستخدم (كل شخص خلف جدار الحماية نفسه، وما إلى ذلك)، فيمكنك إثبات وجود تحدي في نموذج تسجيل الدخول وجعل المتصفح البعيد يقوم بإجراء عملية حسابية موسعة عليه (على سبيل المثال، عامل رقم ) يمكنك التحقق بسرعة من جانب الخادم (مع الضرب السريع).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top