كيفية إنشاء صفحة كلمة مرور HTML. كلمة المرور للصفحة. ضع كلمة المرور على الصفحة

09.12.2020

يجري النظر فيها طرق بسيطةأغلق الدليل أو الملفات بكلمة مرور. كيفية تفويض المستخدم من خلال ملفات تعريف الارتباط. تحديد المستخدم من خلال آلية الجلسة المضمنة في PHP4.

كلمة المرور للصفحة. الجزء 1. نظري إلى حد ما.

قررت أن أصف طرق حماية جزء من الموقع بكلمة مرور. الموضوع في الواقع كبير جدًا، لذا لأول مرة سأقتصر على ترخيص php+mysql.

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

سأضيف شيئين. الأول هو مكان وضع ملف .htpasswd. من خلال التجربة، اكتشفت أنه إذا تم، على سبيل المثال، كتابة المسار إلى مستند يحتوي على رسالة خطأ (ErrorDocument) بالنسبة لمتغير النظام DocumentRoot. لكن المسار إلى ملف كلمة المرور (UserFile) مكتوب بالنسبة إلى ServerRoot. بقدر ما أفهم، لا يمكنك وضع .htpasswd فوق ServerRoot - لا يتم إدراك "../". يتم كل هذا بحيث يمكنك وضع ملف بكلمات مرور، على سبيل المثال، بمستوى واحد فوق الدليل الجذر للموقع، بحيث لا يمكن الوصول إلى الملف من الشبكة على الإطلاق.

والثاني هو أن البرنامج النصي يمكنه معرفة من يفتحه وكلمة المرور: متغيرات $PHP_AUTH_USER و$PHP_AUTH_PW.

العيب الرئيسي لهذه الطريقة هو أن الخادم لا يمكنه حظر تخمين كلمة المرور (بعد عدة محاولات تسجيل دخول غير ناجحة، يُطلب من المستخدم الانتظار لمدة ساعة أو ساعتين، وخلال هذا الوقت يتم تجاهل المكالمات من عنوان IP الخاص به). هذا مكتوب في الوثائق الرسميةوفقا لأباتشي.

عيب آخر هو الحاجة إلى إعادة كتابة الملفات بكلمات مرور عند حذف مستخدم أو إدخال مستخدم جديد. ولكن إذا حدث هذا بشكل غير متكرر، فهذه الطريقة كافية تمامًا، ولا داعي للقلق بشأن كتابة آلية التفويض.

أتمتة الترخيص

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

تتضمن كل صفحة من المنطقة المغلقة ملفًا بالرمز التالي:

$result = mysql_query(" SELECT * من الشخص حيث تسجيل الدخول = "". preg_replace("/[^\\w_-]/"،"،$PHP_AUTH_USER). "" AND pass = "". md5($PHP_AUTH_PW) """)؛ if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic domain=\"User Area\""); header("HTTP/1.0 401 Unauthorized"); print("لتسجيل الدخول إلى جزء مجال المستخدم من الموقع، يجب عليك إدخال اسم المستخدم وكلمة المرور الخاصة بك.");exit(); ); $user_row = mysql_fetch_array($result);

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

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

والطريقة الأخيرة لهذا اليوم هي تخزين البيانات المشفرة في ملفات تعريف الارتباط.

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

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

في الأول - تسجيل الدخول، من أجل تحديد المستخدم على الفور (في قاعدة البيانات، يكون حقل تسجيل الدخول، بالطبع، فريدًا أو حتى مفتاحًا).

إذا (isset($HTTP_COOKIE_VARS[$cookie_login]) && isset($HTTP_COOKIE_VARS[$cookie_code])) ( $login = $HTTP_COOKIE_VARS[$cookie_login]; $code = $HTTP_COOKIE_VARS[$cookie_code]; $result = mysql_query("SELECT" date_format(log_date,"%Y%m%d%H%i%s") كـ log_date1,pass,uid من المستخدم حيث البريد الإلكتروني = "$login" AND log_date>"DATE_SUB(NOW(),INTERVAL 15 MINUTE)"" ); :s"، $log_time0)؛ $current_user = mysql_fetch_array($result); if (md5($current_user["pass"].$current_user["log_date1"].$md5letter) == $code) (mysql_query("UPDATE" تعيين المستخدم log_date = "$log_time2" WHERE uid = ".$current_user["uid"]); setcookie($cookie_code, md5($current_user["pass"].$log_time1.$md5letter), time()+900, $site_path; $auth = true;

مرة أخرى، لا توجد حماية هنا من الاختيار والهجوم على الخادم (بالمناسبة، هنا يمكنك كتابة عنوان IP الخاص بالمستخدم بدلاً من الحرف "Y" - بحيث، على سبيل المثال، لا يستطيع أحد جيران المكتب أخذ ملف بامتداد ملف تعريف الارتباط وتسجيل الدخول من جهاز الكمبيوتر الخاص به).

كلمة المرور للصفحة. الجزء 2. حظر التوظيف

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

ولكن أولا، حول منع الارتداد. التفاهات، ولكن لا يزال.

كلمة المرور المكونة من عشرة أحرف تتكون من أحرف وأرقام لاتينية تعني أن هناك الكثير من الخيارات. إذا خمنت كلمة مرور 1,000,000 مرة في الثانية، فسوف يستغرق الأمر عدة آلاف من السنين. ولكن نظرًا لصعوبة تذكر مثل هذا الهراء، فإننا غالبًا ما نصنع كلمات مرور من كلمات ذات معنى. قبل بضع سنوات، اتضح أنه يمكن تخمين معظم كلمات المرور باستخدام قاموس مكون من 10000 كلمة. في وقت ما، ظهرت دودة (فيروس مثل ذلك) على الشبكة، والتي تسللت إلى خوادم يونكس، باستخدام ثغراتها الأمنية، والتقطت كلمات المرور للمستخدمين المميزين باستخدام... قاموس التدقيق الإملائي لنظام يونكس. لم تكن هناك حاجة لحمل أي شيء! كل مستخدم حتى يدخلتسجيل الدخول الصحيح

  • وكلمة المرور يعتبرها هاكر شرير. ماذا نتعامل عندما يقوم المستخدم بإدخال شيء ما بشكل غير صحيح؟
  • النسيان (لهذا السبب، تحتوي مواقع الويب اللائقة على نموذج "نسيت كلمة المرور" لإرسال كلمة المرور نفسها إلى البريد الإلكتروني الذي تم إدخاله في إعدادات النظام)
  • التدليل ("لأنني لا أهتم")
  • هجوم DoS (من أجل عدم التحميل الزائد على الخادم، تحتاج إلى تقليل الإجراءات التي سينفذها البرنامج النصي في هذه الحالة)

    لقد فكرت لفترة طويلة في كيفية التسبب في التحميل الزائد على الخادم إذا كانت آلية الحماية تعتمد على الملفات. اتضح أن الأمر سهل (كم سيكلف سؤال آخر). لذلك، لنفترض أن الخادم لن يتمكن من التعامل معه إذا حاول البرنامج النصي فتح الملفات للكتابة 1000 مرة في الثانية وكتابة البيانات إليها.

    نظرًا لأنه بعد 5 محاولات فاشلة لتسجيل الدخول، سيتم رفض وصول المستخدم على الفور (دون كتابة أي بيانات إلى ملف)، فأنت بحاجة إلى العثور على 200 عنوان IP فريد، والتي يجب عليك الاتصال بها خمس مرات لكل منها. هذا ممكن. نقوم بتعليق شعار html مع خمس علامات في شريط التمرير:

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

    الشركة)، ووضع ملف .htaccess التالي في الدليل:

    رفض الطلب، السماح بالرفض من كل السماح من xxx.xxx.xxx

    و هنا هو كود البرنامج :< time()-3600) unlink($fn); else $errors = fread(fopen($fn, "r"), 2); }; if ($errors>أخطاء $ = 0؛ $fn = "تجاهل/". preg_replace("[^\d\.]"، ""، $REMOTE_ADDR. ".".$HTTP_FORWARDED_FOR); إذا (is_file($fn)) (إذا (filectime($fn)

    5) ( print(("الوصول مغلق. يرجى العودة بعد ساعة.");exit(); );

    // هنا تم إنشاء الاتصال بخادم قاعدة البيانات. حتى لا تلمس عبثًا إذا تعرض المستخدم "للضرب" على الفور.

    $result = mysql_query("SELECT * FROM user WHERElogin="".preg_replace("/[^\w_\-]/"، ""، $PHP_AUTH_USER). "" AND pass="".md5($PHP_AUTH_PW) """)؛ if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic domain=\"secret Area\""); header("HTTP/1.0 401 Unauthorized"); print ("يتطلب التفويض") ; fwrite(fopen($fn, "w"), ++$errors); $current_user = mysql_fetch_array($result); mysql_free_result($result);

    إنشاء جدول غير صحيح (اسم المستخدم VARCHAR(64) ليس فارغًا، تمرير VARCHAR(64) غير فارغ، ip VARCHAR(255)، الطابع الزمني لوقت تسجيل الدخول)

    وبدلاً من الوصول إلى الملفات، فإننا نعمل مع قاعدة البيانات.

    $errors = @mysql_result(mysql_query("SELECT count(username) as false FROM unauth WHERElogintime>DATE_SUB(NOW(),INTERVAL 1 HOUR) AND ip="$REMOTE_ADDR""),0); إذا (mysql_error()) يموت(mysql_error()); إذا ($errors>5) ( print ("تم إغلاق الوصول. يرجى العودة خلال ساعة واحدة.")؛exit(); ); $result = mysql_query("SELECT * FROM user WHERElogin="".preg_replace("/[^\w_\-]/"، ""، $PHP_AUTH_USER). "" AND pass="".md5($PHP_AUTH_PW) """); if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic domain=\"secret Area\""); header("HTTP/1.0 401 Unauthorized"); print ("يتطلب التفويض") mysql_query("INSERT INTO unauth (اسم المستخدم، المرور، IP) VALUES ("$PHP_AUTH_USER"، "$PHP_AUTH_PW"، "$REMOTE_ADDR $HTTP_X_FORWARDED_FOR")"); $current_user = mysql_fetch_array($result); mysql_free_result($result);

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

    حذف من unauth حيث وقت تسجيل الدخول

    في ظل الأحمال الثقيلة، ستعمل هذه الآلية بشكل أسرع وأكثر موثوقية من الملفات - في قاعدة البيانات، يتم تخزين البيانات المستخدمة بشكل متكرر ومعالجتها مباشرة في ذاكرة الوصول العشوائي (RAM).

    كلمة المرور للصفحة. الجزء 3. كلمة مرور قاعدة البيانات

    لقد واجهت مشكلة ذات مرة: كنت بحاجة إلى إغلاق الجزء الإداري من الموقع، ولكن في نفس الوقت لم أتمكن من وضع ملف .htpasswd فوق الدليل الجذر للموقع. لم يسمح لي الشك الفطري بوضع ملف بكلمة مرور ودليل منفصل ومنع الوصول إليه عبر http.

    قررت أن أحاول إجراء الحماية كما هو الحال في phpMyAdmin: يُطلب من المستخدم تسجيل الدخول وكلمة المرور، والتي يتصل بها البرنامج النصي بقاعدة البيانات. لقد فعلت هذا بالضبط في محلل السجل الخاص بي. راحة هذه الطريقة هي أنه يمكن وضع الملف في أي مكان - بدون ملفات تعريف الارتباط، ولا توجد توجيهات خادم للدليل. وفي الوقت نفسه، إذا تغيرت كلمة المرور في قاعدة البيانات، ليست هناك حاجة لتصحيح أي شيء في البرنامج النصي.

    سأصف الطريقة باستخدام MySQL كمثال. نكتب دالة مثلاً mysql_die:

    الوظيفة mysql_die() ( header("HTTP/1.0 401 Unauthorized"); header("WWW-authenticate: basic realm=\"Statistics\""); print ("تم رفض الوصول. مطلوب اسم المستخدم وكلمة المرور."); خروج ()؛

    في بداية البرنامج، تتم الإشارة إلى مضيف خادم قاعدة البيانات، وإذا لزم الأمر، اسم قاعدة البيانات:

    وللاتصال بقاعدة البيانات، يتم أخذ متغيرات الخادم: $PHP_AUTH_USER و $PHP_AUTH_PW.

    $db_connect = @mysql_connect($db_host, $PHP_AUH_USER, $PHP_AUTH_PW) أو mysql_die();

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

كلمة المرور للصفحة. الجزء 4. ملفات تعريف الارتباط

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

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

// معالجة سطر تسجيل الدخول$login = str_repalce("""، ""، $login)؛ $login_result = mysql_query("حدد معرف من المستخدم حيث تسجيل الدخول = "$login" AND pass = "".md5($pass)."""); إذا (!mysql_error() && @mysql_num_rows($login_result)==1) ( /* إصدار ملفات تعريف الارتباط. من الأفضل تحديد أسماء ملفات تعريف الارتباط ومساراتها في ملف واحد مضمن لتجنب الارتباك. */ setcookie($COOKIE_LOGIN_NAME, $login, time()+3600, $COOKIE_PATH); setcookie($COOKIE_PASSW_NAME, $pass, time()+3600, $COOKIE_PATH);/* مباشرة بعد تسجيل الدخول، تتم إعادة توجيه المستخدم إلى عنوان محمي بكلمة مرور. */ header("الموقع: /somepath/");مخرج؛ ) elseif (!mysql_error()) (

/* عرض رسالة خطأ ونموذج لإعادة الإدخال */

طباعة ("تسجيل الدخول أو كلمة المرور غير صحيحة.")؛ ) طباعة أخرى (mysql_error());تستدعي جميع الصفحات المغلقة ملفًا يتحقق من صحة كلمة المرور التي تم الحصول عليها من ملف تعريف الارتباط:

$login = str_repalce("""، ""، $HTTP_COOKIE_VARS[$COOKIE_LOGIN_NAME]); $login_result = mysql_query("حدد معرف من المستخدم حيث تسجيل الدخول = "$login" AND pass = "".md5($HTTP_COOKIE_VARS[$COOKIE_PASSW_NAME ]). """); إذا (!mysql_error() && @mysql_num_rows($login_result)!=1) (

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

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

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

ولذلك، فإن آخر شيء يمكنك القيام به في هذا الاتجاه هو تغيير ملف تعريف الارتباط في كل مرة يتم فيها تحميل الصفحة. لقد قمت بنفسي بعمل المخطط التالي: يوجد في جدول المستخدمين عمود بتاريخ آخر طلب. يتلقى المستخدم تاريخ الوصول الأخير وكلمة المرور المشفرة عبر md5، مع كل وصول. يأخذ النظام ملف تعريف ارتباط مع تسجيل الدخول، ويسحب هذه السلسلة من قاعدة البيانات، وينشئ تجزئة من حقلي last_log وpasswd ويقارنها بالملف المستلم. إذا كانت متطابقة، فيمكن قبول الزائر. لمزيد من الأمان، يمكنك إضافة فحص لانتهاء صلاحية ملف تعريف الارتباط - يجب أن تنتهي صلاحية ملف تعريف الارتباط بعد نصف ساعة من عدم النشاط، وبالتالي، يجب أن يكون تاريخ آخر تسجيل في قاعدة البيانات قبل أقل من نصف ساعة.$login = str_repalce("""، ""، $HTTP_COOKIE_VARS[$COOKIE_LOGIN_NAME]); $login_result = mysql_query("SELECT * من المستخدم حيث تسجيل الدخول = "$login" AND last_log>DATE_SUB(NOW(), INTERVAL 30 MINUTE) "); إذا (!mysql_error() && @mysql_num_rows($login_result)==1) ( /* نحصل على صف جدول ونشكل تجزئة من الحقول المطلوبة. */$current_user = mysql_fetch_array($login_result); $hash_to_check = md5($current_user["passwd"]. "Y - حتى لا يخمن أحد." $current_user); header("الموقع: /login.php");

مخرج؛ ); ) elseif (!mysql_error() && @mysql_num_rows($log_result)!=1) ( header("Location: /login.php");exit; ) else print (mysql_error());بالطبع

"Y - حتى لا يخمن أحد"

ومن الأفضل أيضًا فصله إلى متغير منفصل، ومن الأفضل استخدام عنوان IP الخاص بالزائر بدلاً من هذا السطر (أو، في حالة الاتصال الهاتفي المعطل، أول رقمين/ثلاثة أرقام من عنوان IP). بالمناسبة، حول عنوان IP. من الأفضل التحقق من ذلك، ولكن ليس العنوان بالكامل، ولكن فقط أول رقمين (لعنوان IP الذي يبدأ برقم أقل من 127) أو ثلاثة أرقام (على التوالي، أكثر من 127) من العنوان.سيوفر هذا لمستخدمي الاتصال الهاتفي السيئ والمتقطع من الاضطرار إلى تسجيل الدخول مرة أخرى بعد فقدان الاتصال، وفي الوقت نفسه، لن يسمح للمهاجم الذي سرق ملف تعريف الارتباط بتسجيل الدخول. بالطبع، لن يتمكن من معاودة الاتصال وتسجيل الدخول من خلال مزود آخر - عنوان المسبح ليس هو نفسه، لكن هذه ليست مشكلتنا ("في هذا الطقس يبقون في المنزل"). كما أن سرقة كلمات المرور داخل الشركة ليست مشكلتنا. لقد قمنا بالحماية من الرفاق الفضوليين والمتسللين الأميين، لكن لا يمكننا فعل أي شيء ضد أحصنة طروادة والمتشممين الذين يمكن تثبيتهم على الضحية.

هذا هو المكان الذي تنتهي فيه "الأجراس والصفارات".

حماية أكثر موثوقية

الحالات التي يكون فيها العمل في الجلسات ضروريًا ليست متكررة. على سبيل المثال، في لعبتي "Monopolist" بدأت على الفور في استخدام الجلسات، لأنه يمكن للمستخدم لعب العديد من الألعاب ويمكن أن تحتوي نفس الصفحة في نفس الجلسة على بيانات مختلفة.

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

التفويض - عبر رأس 401 ("المجال") أو ملفات تعريف الارتباط أو الجلسات - سأعود لاحقًا. الآن دعونا نتحدث عن الجلسات.

الجلسات في PHP ليست في الواقع طريقة ترخيص (المفهوم نفسه غير صحيح، ولكن في المنتديات يسألون بالضبط "كيفية تخويل المستخدم من خلال الجلسات؟"). تحدد آلية جلسة المستخدم المضمنة في PHP هؤلاء المستخدمين فقط؛ ومرة ​​أخرى، فإن التفويض هو عمل البرنامج النصي الخاص بك.

لن أخبركم كثيرًا عن آلية الجلسات، فقد قيل بالفعل. تعمل هذه الآلية في أبسط أشكالها (أو بالأحرى في أكثر أشكالها الافتراضية) على النحو التالي: يحتفظ النظام بملف جلسة على الخادم، والذي يحتوي على متغيراته.

عند بدء الجلسة، يتلقى المستخدم معرفًا فريدًا (عادةً من خلال ملف تعريف الارتباط)، وعند الوصول إلى صفحات أخرى، يرسله. عند تشغيل آلية الجلسة في البرنامج النصي الخاص بك، يتحقق معالج php من وجود ملف يتوافق مع معرف الجلسة الواردة - إذا كان موجودًا، فسيتمكن البرنامج النصي من قراءة البيانات من الملف، وإذا لم يكن موجودًا، فسيتم تشغيل جلسة جديدة وسيتم إنشاء الملف.وبطبيعة الحال، يتم تعريف اسم هذا المتغير في إعدادات PHP.

الآن حول الوظائف التي نستخدمها.جلسة_بدء ()

. يطلق آلية الجلسة نفسها. يجب أن يكون لدى المستخدم متغير وملف مطابق.إذا لم يكن هناك ملف، يتم إنشاؤه وتبدأ الجلسة من البداية. إذا لم يكن هناك ملف أو متغير، فسيتم إنشاء متغير (على سبيل المثال، يتم إرسال رأس مع ملف تعريف الارتباط) ويتم إنشاء الملف.).

جلسة_تسجيل (الاسم 1، الاسم 2، الاسم 3 ...).

تعيين معلمات ملفات تعريف الارتباط باستخدام معرف الجلسة (افتراضيًا، يتم تعيين ملف تعريف الارتباط على جذر الخادم ولمدة 0 ثانية - حتى يتم إغلاق المتصفح).

هذا كل شيء في الوقت الراهن. ستكون هناك قضايا منفصلة حول الجلسات بالتفصيل. سأصف حاليًا آلية الترخيص وتحديد المستخدم باستخدام الجلسات.

لذلك، لدينا ثلاثة ملفات - تسجيل الدخول والتحقق (المصادقة) والإخراج (تسجيل الخروج).// قطع جميع الأحرف غير المرغوب فيها $login = preg_replace("/[^\w_\.\-]/"، ""، $HTTP_POST_VARS["login"]); $pass = Trim($HTTP_POST_VARS["pass"]);// التحقق من المتغيرات if (strlen($login)==0 || strlen($pass)==0) $error = "أدخل معلومات تسجيل الدخول وكلمة المرور"; آخر(// التحقق من تسجيل الدخول وكلمة المرور $user_result = mysql_query("SELECT * من المستخدم حيث تسجيل الدخول = "$login" AND pass = "".md5($pass).""");/* إذا حدث خطأ في قاعدة البيانات (على سبيل المثال، قام المستخدم بإدخال متغير طويل المدى في الجلسة، والذي لم ترغب قاعدة البيانات في استيعابه) أو ظهور أكثر من سطر واحد، فإننا نطرد المستخدم */ إذا (mysql_error()) يموت(mysql_error()); elseif (@mysql_num_rows($user_result) != 1) $error = " اسم غير صالحاسم المستخدم أو كلمة المرور."; // إذا كان كل شيء على ما يرام، فحدد البيانات، وابدأ الجلسةآخر ( $user = mysql_fetch_assoc($user_result); session_set_cookie_params(1800, "/"); session_start(); // تذكر بيانات المستخدم session_register("المستخدم"); // ثم أرسله إلى مكان ما if (isset($HTTP_POST_VARS["return"])) header("الموقع: ($HTTP_POST_VARS["return"])"); رأس آخر("الموقع: /");

مخرج()؛ );

);/* هنا لم يعد المستخدم مخولاً، ولكن يمكنه إرسال ملف تعريف الارتباط من جلسة مغلقة. دعونا تنظيفه. */ if (isset($HTTP_COOKIE_VARS)) setcookie(session_name());// بعد ذلك نرسم الشكل، وهذا ليس مثيرًا للاهتمام. هذا البرنامج النصي عبارة عن معالج ونموذج لإدخال البيانات. عندما يتلقى تسجيل الدخول وكلمة المرور، فإنه يعالجهما، وإذا كانا صحيحين، يتوقف عن العمل، ويرسل المستخدم إلى الصفحة المطلوبة. إذا كانت البيانات غير صحيحة أو مفقودة تمامًا، فسيتم رسم النموذج./* اقتل متغير المستخدم بحيث يكون من المستحيل إرسال البيانات في طلب نشر بعد رسم النموذج. */ غير محدد($user);// علامة "خطأ في الجلسة" - إذا تم تمكينها، فسيتوقف العمل. /* إذا لم يكن هناك تسجيل دخول وكلمة مرور في المصفوفة، فسيتوقف العمل أيضًا ("لا نعرف شيئًا، لقد قدمناهما لك") */ if (!isset($user["login"]) || !isset($user["pass"])) $session_error = true; );/* إذا تمكن المستخدم حتى الآن من تجنب الأخطاء بشكل بطولي، فسيتم إجراء فحص من خلال قاعدة البيانات بنفس الطريقة المتبعة عند الإدخال. */ إذا (!$session_error) ( $check_result = mysql_query("حدد uid من المستخدم حيث تسجيل الدخول = "($user)" AND pass = "($user)""); if (mysql_error() || @mysql_num_rows($user_result ) != 1) $session_error = true );// إذا كان هناك خطأ ما، إذن إذا ($session_error) (// تدمير بيانات الجلسة session_destroy();// تدمير ملف تعريف الارتباط إذا كان هناك واحد if (!isset($HTTP_COOKIE_VARS)) setcookie(session_name()"،"،"،/")؛/* إرسال المستخدم لتسجيل الدخول، مع خيار العودة إلى العنوان المطلوب */ header("الموقع: /login.php?return=$REQUEST_URI");// توقف عن العمل

مخرج()؛ ); mysql_free_result($check_result);

<? print ("Здравствуйте, {$user} {$user}!"); ?>

يتم فحص المستخدم وفي مصفوفة $user - جميع البيانات المتعلقة به، يمكنك، على سبيل المثال، الترحيب به باسمه الأول وعائلته: إذا (إيسيت($HTTP_COOKIE_VARS)) (// ابدأ آلية الجلسة session_start();// حذف الملف session_destroy();// حذف ملفات تعريف الارتباط setcookie(session_name());

); // صفحة الخروج header("الموقع: /login.php"); بعض الملاحظات: الجزء المحمي بكلمة مرور فيفي هذا المثال - الخادم بأكمله (على سبيل المثال، Service.firm.ru)، لإغلاق الدليل الذي تحتاجه لتصحيح المسارات. بدلاً من PHPSESSID مستخدم.




اسم_الجلسة()

بحيث يمكنك تغيير اسم المعرف بحرية. بالمناسبة، على خادم فعلي واحد، يمكنك إنشاء أسماء مختلفة لمعرفات الجلسة - فقط ضع ملف .htaccess مع السطر في الجزء المطلوب php_value اسم الجلسة "ABRACADABRA"إذا كان لديك أي أسئلة أخرى أو كان هناك شيء غير واضح - مرحباً بك في موقعنا


تنص إحدى البديهيات الرئيسية لأمن المعلومات على أن "راحة النظام تتناسب عكسيا مع أمنه". هذا يعني أنه عند اختيار نظام الحماية عليك أن تجده


في الدرس السابق، تناولنا التفويض باستخدام خادم الويب (التفويض الأساسي). ربما يكون هذا هو الأسهل والأكثر طريقة آمنةالقيود المفروضة على الوصول إلى الموارد. ومع ذلك، فإن الحفاظ على مثل هذه الآلية يتطلب عمالة كثيفة، خاصة عندما كميات كبيرةالمستخدمين مع حقوق مختلفة. بالإضافة إلى ذلك، لا تسمح كافة الخوادم بمصادقة HTTP.


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

منظمة حماية كلمة المروريقع بالكامل على أكتاف المبرمج. يجب على المطور التأكد من أمان تخزين قوائم المستخدمين، والتحقق من تسجيلات الدخول/كلمات المرور، وحفظ سياقات الأمان وإعادة استخدامها. يتم فهم سياق الأمان هنا على أنه مجموعة من المعلمات التي تحدد المستخدم بشكل فريد (على الأقل، هذا هو تسجيل الدخول وكلمة المرور ومعرف الجلسة).

فكر في مثال لتنفيذ أبسط حماية لكلمة المرور. لنقم بإنشاء ملف logon.php

عند النقر على زر "تسجيل الدخول"، سيتم إرسال بيانات النموذج إلى الخادم، حيث سيتحقق البرنامج النصي من معلومات تسجيل الدخول وكلمة المرور التي تم إدخالها وإذا كانت تساوي "admin" و"megaPass"، على التوالي، فسيتم عرض رسالة مفادها أن تسجيل الدخول مسموح به. إذا كان تسجيل الدخول أو كلمة المرور غير صحيحة، فسيرى المستخدم رسالة تحذير.

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

http://localhost/logon.php?login=admin&passwd=megaPass

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

العيب الثالث: لا يتم تذكر نتائج تسجيل دخول المستخدم، أي. ما عليك سوى تحديث الصفحة وسيُطلب منك إدخال كلمة المرور الخاصة بك مرة أخرى.

لذلك، دعونا ننظر في سبل القضاء على هذه العيوب.

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

كما ذكر أعلاه، يجب تخزين قوائم المستخدمين بشكل منفصل. لنقم بإنشاء جدول في قاعدة بيانات الاختبار:

إنشاء جدول `smplusers` (
`user_id` int(11) ليس زيادة تلقائية فارغة،
`اسم_المستخدم` varchar(50) ليس فارغًا،
`user_login` varchar(50) ليس فارغًا،
`user_password` varchar(50) ليست فارغة،
`reg_date` التاريخ والوقت ليس فارغًا،
المفتاح الأساسي (`user_id`)
)

وإضافة العديد من سجلات المستخدم إليها:

أدخل في smplUsers
(اسم المستخدم، تسجيل الدخول للمستخدم، كلمة مرور المستخدم، reg_date)
قيم
("إيفانوف الثاني"، "إيفانوف-آي"، "pass1"، NOW())،
("بيتروف بي بي."، "بتروفيتش"، "pass2"، NOW())،
("Sidorov S.S."، "sidorov"، "pass3"، NOW())

يرجى ملاحظة أن عامل التشغيل INSERT يسمح بإضافة عدة سجلات إلى الجدول مرة واحدة، ويتم إدراج البيانات في كتل مفصولة بفواصل.

الآن دعونا نغير logon.php بحيث يتم التحقق من اسم المستخدم وكلمة المرور بشكل صحيح مباشرة في قاعدة البيانات:

// الاتصال بقاعدة البيانات هنا
// رابط $ - رابط الاتصال
$link = mysql_connect("localhost", "db_user", "db_passwd");
mysql_select_db("db_name", $link);
?>

$passwd = isset($_POST["passwd"])?$_POST["passwd"]:"";
$login = mysql_real_escape_string($login);
$passwd = mysql_real_escape_string($passwd);

إذا($تسجيل الدخول != "" || $passwd != "")
{
$sql = "SELECT * FROM smmplUsers
أين user_login = "$login"
AND user_password = "$passwd"
الحد 1"؛
$qry = mysql_query($sql, $link);
إذا($qry)
{
إذا (mysql_num_rows($qry) > 0)
{
صدى "تم منح الوصول
" . "\n";

صدى "المستخدم:". $row["user_name"];
}
آخر
صدى "تم رفض الوصول!";
}
}
آخر
صدى "أدخل اسم المستخدم وكلمة المرور";
?>





الآن يتم إرسال تسجيل الدخول وكلمة المرور بشكل سري، ومن السهل جدًا تغيير بيانات الاعتماد عن طريق تحرير الجدول في قاعدة البيانات. تبقى الخطوة الأخيرة - لتعليم الخادم أن يتذكر حقيقة التسجيل. أسهل طريقة للقيام بذلك هي استخدام آلية الجلسة. دعونا نجري التغييرات اللازمة:

session_start();
?>

if(!$_SESSION["user_id"]) $_SESSION["user_id"] = -1;
...
إذا (mysql_num_rows($qry) > 0)
{
صدى "تم منح الوصول
" . "\n";
// هنا نقوم بالاتصال بقاعدة البيانات...
$login = isset($_POST["login"])?$_POST["login"]:"";
}
$row = mysql_fetch_array($qry);
?>
...

سيتذكر الخادم الآن كل مستخدم قام بتسجيل الدخول بنجاح، وسيعرض رسالة ترحيب في المرة التالية التي يتم فيها تحديث الصفحة.

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

قررت أن أصف طرق حماية جزء من الموقع بكلمة مرور. الموضوع في الواقع كبير جدًا، لذا لأول مرة سأقتصر على ترخيص php+mysql.

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

سأضيف شيئين. الأول هو مكان وضع ملف .htpasswd. من خلال التجربة، اكتشفت أنه إذا تم، على سبيل المثال، كتابة المسار إلى مستند يحتوي على رسالة خطأ (ErrorDocument) بالنسبة لمتغير النظام DocumentRoot. لكن المسار إلى ملف كلمة المرور (UserFile) مكتوب بالنسبة إلى ServerRoot. بقدر ما أفهم، لا يمكنك وضع .htpasswd فوق ServerRoot - لا يتم إدراك "../". يتم كل هذا بحيث يمكنك وضع ملف بكلمات مرور، على سبيل المثال، بمستوى واحد فوق الدليل الجذر للموقع، بحيث لا يمكن الوصول إلى الملف من الشبكة على الإطلاق.

والثاني هو أن البرنامج النصي يمكنه معرفة من يفتحه وكلمة المرور: متغيرات $PHP_AUTH_USER و$PHP_AUTH_PW.

العيب الرئيسي لهذه الطريقة هو أن الخادم لا يمكنه حظر تخمين كلمة المرور (بعد عدة محاولات تسجيل دخول غير ناجحة، يُطلب من المستخدم الانتظار لمدة ساعة أو ساعتين، وخلال هذا الوقت يتم تجاهل المكالمات من عنوان IP الخاص به). هذا مكتوب في وثائق أباتشي الرسمية.

عيب آخر هو الحاجة إلى إعادة كتابة الملفات بكلمات مرور عند حذف مستخدم أو إدخال مستخدم جديد. ولكن إذا حدث هذا بشكل غير متكرر، فهذه الطريقة كافية تمامًا، ولا داعي للقلق بشأن كتابة آلية التفويض.

أتمتة الترخيص

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

تتضمن كل صفحة من المنطقة المغلقة ملفًا بالرمز التالي:

$result = mysql_query(" SELECT * من الشخص حيث تسجيل الدخول = "". preg_replace("/[^w_-]/"،"،$PHP_AUTH_USER). "" AND pass="". md5($PHP_AUTH_PW). " ""); if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic realm = "منطقة المستخدم""); header("HTTP/1.0 401 Unauthorized"); print("لتسجيل الدخول إلى منطقة المستخدم" للموقع، يجب عليك إدخال اسم المستخدم وكلمة المرور الخاصة بك.");exit(); ); $user_row = mysql_fetch_array($result);

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

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

والطريقة الأخيرة لهذا اليوم هي تخزين البيانات المشفرة في ملفات تعريف الارتباط.

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

يتحقق برنامج الإدخال من تسجيل الدخول وكلمة المرور ويصدر ملفي تعريف ارتباط. في الأول - تسجيل الدخول، من أجل تحديد المستخدم على الفور (في قاعدة البيانات، يكون حقل تسجيل الدخول، بالطبع، فريدًا أو حتى مفتاحًا). يحتوي ملف تعريف الارتباط الثاني على تجزئة وقت تسجيل الدخول وكلمة المرور (من أجل اكتمال السرية، أضف الحرف "Y" إلى هذه السطور - ثم يكاد يكون من المستحيل العثور على التجزئة :).

تشتمل كافة البرامج الأخرى على تعليمات برمجية تقوم بما يلي. يقدم طلبًا إلى قاعدة البيانات - يختار السطر الذي يحتوي على معلومات تسجيل الدخول المستلمة. من هذا السطر، يأخذ حقل "log_time" وكلمة المرور ويقوم بعمل تجزئة منهما، كما هو موضح أعلاه. يقارنها بما تلقاه، وإذا تطابقا، يصدر ملف تعريف ارتباط تجزئة جديدًا، مرة أخرى، من كلمة المرور والوقت والحرف "Y" ويقوم بإجراء استعلام إلى قاعدة البيانات "UPDATE user SET log_time='...' حيث يتم تسجيل الدخول ='$ cookie_login'".

إذا (isset($HTTP_COOKIE_VARS[$cookie_login]) && isset($HTTP_COOKIE_VARS[$cookie_code])) ( $login = $HTTP_COOKIE_VARS[$cookie_login]; $code = $HTTP_COOKIE_VARS[$cookie_code]; $result = mysql_query("SELECT" date_format(log_date,"%Y%m%d%H%i%s") كـ log_date1,pass,uid من المستخدم حيث البريد الإلكتروني = "$login" AND log_date>"DATE_SUB(NOW(),INTERVAL 15 MINUTE)"" ); :s"، $log_time0)؛ $current_user = mysql_fetch_array($result); if (md5($current_user["pass"].$current_user["log_date1"].$md5letter) == $code) (mysql_query("UPDATE" تعيين المستخدم log_date = "$log_time2" WHERE uid = ".$current_user["uid"]); setcookie($cookie_code, md5($current_user["pass"].$log_time1.$md5letter), time()+900, $site_path; $auth = true;

مرة أخرى، لا توجد حماية هنا من الاختيار والهجوم على الخادم (بالمناسبة، هنا يمكنك كتابة عنوان IP الخاص بالمستخدم بدلاً من الحرف "Y" - بحيث، على سبيل المثال، لا يستطيع أحد جيران المكتب أخذ ملف بامتداد ملف تعريف الارتباط وتسجيل الدخول من جهاز الكمبيوتر الخاص به).

كلمة المرور للصفحة. الجزء 2. حظر التوظيف

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

ولكن أولا، حول منع الارتداد. التفاهات، ولكن لا يزال. كلمة المرور المكونة من عشرة أحرف تتكون من أحرف وأرقام لاتينية تعني أن هناك الكثير من الخيارات. إذا خمنت كلمة مرور 1,000,000 مرة في الثانية، فسوف يستغرق الأمر عدة آلاف من السنين. ولكن نظرًا لصعوبة تذكر مثل هذا الهراء، فإننا غالبًا ما نصنع كلمات مرور من كلمات ذات معنى. قبل بضع سنوات، اتضح أنه يمكن تخمين معظم كلمات المرور باستخدام قاموس مكون من 10000 كلمة. في وقت ما، ظهرت دودة (مثل هذا الفيروس) على الشبكة، والتي تسلقت خوادم يونكس، باستخدام ثغراتها الأمنية، والتقطت كلمات المرور للمستخدمين المميزين باستخدام... قاموس التدقيق الإملائي لنظام يونكس. لم تكن هناك حاجة لحمل أي شيء!

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

لقد فكرت لفترة طويلة في كيفية التسبب في التحميل الزائد على الخادم إذا كانت آلية الحماية تعتمد على الملفات. اتضح أن الأمر سهل (كم سيكلف سؤال آخر). لذلك، لنفترض أن الخادم لن يتمكن من التعامل معه إذا حاول البرنامج النصي فتح الملفات للكتابة 1000 مرة في الثانية وكتابة البيانات إليها. نظرًا لأنه بعد 5 محاولات فاشلة لتسجيل الدخول، سيتم رفض وصول المستخدم على الفور (دون كتابة أي بيانات إلى ملف)، فأنت بحاجة إلى العثور على 200 عنوان IP فريد، والتي يجب عليك الاتصال بها خمس مرات لكل منها. هذا ممكن. نقوم بتعليق شعار html مع خمس علامات في شريط التمرير:

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

ولكن مع ذلك، سأعطيك هذه الطريقة - كتبتها عبثًا، أم ماذا؟ بالمناسبة، يمكن استخدامه دون خوف كبير لعدد محدود من العناوين (على سبيل المثال، للشبكة المحلية للشركة) عن طريق وضع ملف .htaccess في الدليل بالمحتوى التالي:

رفض الطلب، السماح
أنكر من الجميع
السماح من xxx.xxx.xxx

رفض الطلب، السماح بالرفض من كل السماح من xxx.xxx.xxx

أخطاء $ = 0؛ $fn = "تجاهل/". preg_replace("[^d.]"، ""، $REMOTE_ADDR. ".".$HTTP_FORWARDED_FOR); إذا (is_file($fn)) (إذا (filectime($fn)< time()-3600) unlink($fn); else $errors = fread(fopen($fn, "r"), 2); }; if ($errors>5) ( print(("الوصول مغلق. يرجى العودة بعد ساعة.");exit(); ); // هنا تم إنشاء الاتصال بخادم قاعدة البيانات. حتى لا تلمس عبثًا إذا تعرض المستخدم "للضرب" على الفور. $result = mysql_query("SELECT * FROM user WHERElogin="".preg_replace("/[^w_-]/"، ""، $PHP_AUTH_USER). "" AND pass="".md5($PHP_AUTH_PW). " ""); if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic realm = "secret Area""); header("HTTP/1.0 401 Unauthorized"); print ("الترخيص مطلوب"); fwrite (fopen($fn, "w"), ++$errors); $current_user = mysql_fetch_array($result); mysql_free_result($result); ومع ذلك، يعد العمل مع الملفات خطيئة إذا كانت هناك قاعدة بيانات. نكتة. بالنسبة للتفويضات الفاشلة، نقوم بإنشاء جدول: CREATE TABLE unauth (اسم المستخدم VARCHAR(64) NOT NULL، تمرير VARCHAR(64) NOT NULL، ip VARCHAR(255)، وقت تسجيل الدخول TIMESTAMP) وبدلاً من الوصول إلى الملفات، نعمل مع قاعدة البيانات. $errors = @mysql_result(mysql_query("SELECT count(username) as false FROM unauth WHERElogintime>DATE_SUB(NOW(),INTERVAL 1 HOUR) AND ip="$REMOTE_ADDR""),0); إذا (mysql_error()) يموت(mysql_error()); إذا ($errors>5) ( print ("تم إغلاق الوصول. يرجى العودة خلال ساعة واحدة.")؛exit(); ); $result = mysql_query("SELECT * FROM user WHERElogin="".preg_replace("/[^w_-]/"، ""، $PHP_AUTH_USER). "" AND pass="".md5($PHP_AUTH_PW). " ""); if (@mysql_num_rows($result)!=1) ( header("WWW-Authenticate: Basic realm = "secret Area""); header("HTTP/1.0 401 Unauthorized"); print ("الترخيص مطلوب"); mysql_query ("INSERT INTO unauth (اسم المستخدم، المرور، IP) VALUES ("$PHP_AUTH_USER"، "$PHP_AUTH_PW"، "$REMOTE_ADDR $HTTP_X_FORWARDED_FOR")"); $current_user = mysql_fetch_array($result); mysql_free_result($result);

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

حذف من unauth حيث وقت تسجيل الدخول

في ظل الأحمال الثقيلة، ستعمل هذه الآلية بشكل أسرع وأكثر موثوقية من الملفات - في قاعدة البيانات، يتم تخزين البيانات المستخدمة بشكل متكرر ومعالجتها مباشرة في ذاكرة الوصول العشوائي (RAM).

كلمة المرور للصفحة. الجزء 3. كلمة مرور قاعدة البيانات

لقد واجهت مشكلة ذات مرة: كنت بحاجة إلى إغلاق الجزء الإداري من الموقع، ولكن في نفس الوقت لم أتمكن من وضع ملف .htpasswd فوق الدليل الجذر للموقع. لم يسمح لي الشك الفطري بوضع ملف بكلمة مرور ودليل منفصل ومنع الوصول إليه عبر http. قررت أن أحاول إجراء الحماية كما هو الحال في phpMyAdmin: يُطلب من المستخدم تسجيل الدخول وكلمة المرور، والتي يتصل بها البرنامج النصي بقاعدة البيانات. لقد فعلت هذا بالضبط في محلل السجل الخاص بي. راحة هذه الطريقة هي أنه يمكن وضع الملف في أي مكان - بدون ملفات تعريف الارتباط، ولا توجد توجيهات خادم للدليل. وفي الوقت نفسه، إذا تغيرت كلمة المرور في قاعدة البيانات، ليست هناك حاجة لتصحيح أي شيء في البرنامج النصي.