المصادقة الآمنة في JavaScript: كيف لا تحرق كلمات المرور

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كلمة المرور "qwerty123" لم تعد صالحة: لماذا الأمان ليس مملاً

\n\n

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

\n\n

في هذه المقالة، سنشرح كيفية حماية تطبيقك من الهجمات الأكثر شيوعًا: اعتراض الرموز، XSS، CSRF، وتسرب كلمات المرور. لن نلقي محاضرات عن "يجب أن تفعل الأمور بشكل صحيح" - بل سنعرض كودًا يمكنك استخدامه الآن.

\n\n

هل أنت مستعد؟ هيا بنا.

\n\n

المصادقة في JavaScript: لماذا العميل هو ساحة المعركة

\n\n

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

\n\n

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

\n\n

التهديدات الرئيسية من جانب العميل

\n\n
    \n
  • XSS (Cross-Site Scripting) - يقوم المهاجم بإدخال سكريبت يسرق الرموز من localStorage.
  • \n
  • CSRF (Cross-Site Request Forgery) - المستخدم مصرح له، ويقوم موقع ضار بإرسال طلبات نيابة عنه.
  • \n
  • Man-in-the-Middle - اعتراض حركة المرور إذا لم يتم استخدام HTTPS.
  • \n
  • تسرب كلمات المرور - إرسال كلمة المرور بنص واضح أو تخزينها في الكود.
  • \n
\n\n

يبدو مخيفًا؟ في الواقع، الحماية من هذا ليست صعبة. الشيء الرئيسي هو معرفة الأدوات التي يجب استخدامها.

\n\n

JWT: مريح ولكن مع مفاجأة

\n\n

JWT (JSON Web Token) هو معيار لإنشاء رموز الوصول. إنه خفيف، ولا يتطلب تخزينًا على الخادم، ومناسب تمامًا لتطبيقات SPA. لكن شعبيته تجعله هدفًا.

\n\n

يقوم العديد من المطورين بتخزين JWT في localStorage. هذا خطأ. localStorage متاح من أي كود JavaScript على الصفحة. إذا كان لديك ثغرة XSS واحدة على الأقل - فقد تمت سرقة الرمز.

\n\n

كيفية تخزين JWT بشكل صحيح

\n\n

أفضل طريقة هي httpOnly cookie. الكوكيز مع العلم httpOnly غير متاحة لـ JavaScript. لن تسرقها XSS. لكن هناك فارق بسيط: يتم إرسال الكوكيز تلقائيًا مع كل طلب، مما يجعل التطبيق عرضة لـ CSRF. الحل هو استخدام SameSite و رموز CSRF.

\n\n

إليك مثال على تعيين httpOnly cookie على الباك إند (Node.js مع Express):

\n\n
// الخادم (Node.js / Express)\nres.cookie('token', jwtToken, {\n  httpOnly: true,       // غير متاح لـ JavaScript\n  secure: true,         // فقط عبر HTTPS\n  sameSite: 'strict',   // حماية من CSRF\n  maxAge: 3600000       // ساعة واحدة\n});
\n\n

على العميل، تقوم ببساطة بإرسال الطلبات - سيتم إرفاق الكوكيز تلقائيًا:

\n\n
// العميل (JavaScript)\nfetch('/api/profile', {\n  method: 'GET',\n  credentials: 'include' // إلزامي!\n})\n.then(res => res.json())\n.then(data => console.log(data));
\n\n

لاحظ: credentials: 'include' - بدون هذا، لن يتم إرسال الكوكيز إلى origin آخر.

\n\n

تجزئة كلمات المرور: bcrypt لمساعدتك

\n\n

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

\n\n

bcrypt هو خوارزمية تجزئة مصممة خصيصًا لتكون بطيئة. لأن تجزئة كلمة المرور للمستخدم تستغرق أجزاء من الثانية، بينما يستغرق تخمينها سنوات. في JavaScript (Node.js) استخدم المكتبة b

المدونات

توصيات الكتب