حماية PHP: أين وكيف يتم تخزين كلمات المرور. الجزء 2

مرحبا بالجميع! في الأسبوع الماضي ، نشرنا الجزء الأول من هذا المقال ، والذي تسبب في holivar خطيرة.

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


يمكنك معرفة المزيد حول البرنامج التدريبي في اليوم المفتوح ، وبمثال ندوة عبر الإنترنت المجانية حول موضوع "ServerLess PHP" ، يمكنك تقييم تنسيق المحاضرات.

ربما سنختتم هذه المقدمة الممتدة بالفعل وننتقل مباشرةً إلى المقال.

كلمة السر البعثرة مع password_hash


تعمل هذه الوظيفة على إنشاء كلمة مرور تجزئة وفقًا للمعايير التي حددناها لها. يستخدم خوارزمية أحادية الاتجاه.

يمكننا اختيار نوع الخوارزمية المراد استخدامها من خلال تعيين أحد الثوابت التي تختارها:

  • يستخدم PASSWORD_DEFAULT من PHP 5.5 Bcrypt كخوارزمية افتراضية. ومع ذلك ، بمرور الوقت ، يتغير هذا كلما تم اكتشاف خوارزميات جديدة أكثر أمانًا أو عوامل أخرى.
  • PASSWORD_BCRYPT ينشئ تجزئة crypt() . عادةً ما يحتوي على 60 حرفًا ، ويمكن تحديده بواسطة معرفه بالتنسيق "$ 2y $" .
  • PASSWORD-ARGON2I Argon2 هي واحدة من خوارزميات التجزئة الأكثر أمانًا. يكون متاحًا فقط إذا تم تجميع PHP باستخدام Argon2.
  • PASSWORD_ARGON2ID تنتمي خوارزمية التجزئة هذه أيضًا إلى عائلة Argon2 وتستخدم إصدار Argon2ID ، وليس I. لكي تعمل ، من الضروري أيضًا تجميع PHP باستخدام Argon2.

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

إذا قمت بتحديد خوارزمية تستخدم Argon2 ، فإن مفاتيح المصفوفة الترابطية هي: memory_cost (عدد صحيح يشير إلى الحد الأقصى لحجم الذاكرة اللازمة لحساب التجزئة) ، time_cost (عدد صحيح يشير إلى الحد الأقصى للوقت اللازم لحساب التجزئة) ومؤشر thread (عدد صحيح آخر) رقم يشير إلى عدد مؤشرات الترابط المستخدمة لحساب التجزئة).

لا تحدد معلمة salt في PHP 7.0 ، وإلا ستتلقى تحذيرًا بشأن الطريقة التي تم إهمالها.

الآن نحن نعرف العناصر اللازمة لاستخدام password_hash() وظيفة. دعونا نرى كيف يصف ذلك.

 echo password_hash("MySuperPass", PASSWORD_DEFAULT); $2y$10$TLayAY8ZaAZ9FE50EylGYO9oEgrb7gsw1yzJemHdBu1gOQfyWrEUm $options = ['cost' => 12,]; echo password_hash("MySuperPass", PASSWORD_BCRYPT, $options); $2y$12$jhmTbxAuZXVtX2y.Jc8iy.dW/NENqVCeq2vuoFI9/oa4./YlzhpYO echo password_hash('rasmuslerdorf', PASSWORD_ARGON2I); $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0 

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

سيساعدك البرنامج النصي في المثال أعلاه على تعيين قيمة التكلفة المثلى لجهازك.

التحقق من كلمة مرور المستخدم


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

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

ماذا الان

الآن يجب السماح للمستخدمين بتسجيل الدخول إلى التطبيق. للقيام بذلك ، يحتوي PHP على وظيفة مضمّنة تتحقق من مطابقة كلمة المرور لتسلسل التجزئة. تسمى هذه الوظيفة password_verify() . يعمل مثل هذا:

 $hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; if (password_verify('rasmuslerdorf', $hash)) { echo ' !'; } else { echo '  !'; } 

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

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

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

وبالتالي ، فإن جميع المعلومات اللازمة password_verify() متاحة لنا.

خوارزمية نظام تسجيل المستخدم على PHP


آمل أن تفهم الآن التدابير الأمنية التي يتخذها مطورو PHP عند التعامل مع كلمات المرور.

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

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

استنتاج


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

اقرأ الجزء الأول

Source: https://habr.com/ru/post/ar475874/


All Articles