قم بتأمين تطبيقاتك عن طريق التحقق من صحة البيانات على مستوى الطلب باستخدام مكتبة التحقق من صحة Joi.

يمكن أن يتسبب قبول البيانات غير المختبرة وغير المؤكدة في تطبيق ويب في حدوث ثغرات أمنية ، ويمكن أن تنشأ مشكلات غير متوقعة من البيانات غير الصالحة.

تسمح لك Node.js ORMs ، مثل Sequelize و TypeORM ، بتعيين قواعد التحقق من الصحة خارج المربع على مستوى التطبيق. أثناء تطوير واجهة برمجة التطبيقات ، تأتي البيانات من طلبات HTTP إلى نقاط نهاية محددة. يحدث هذا على مستوى الطلب ؛ وبالتالي ، فإن التحقق الافتراضي الذي توفره ORMs لا ينطبق عليها.

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

إعداد مشروع تجريبي

لشرح كيف جوي للتحقق من صحة البيانات ، ستقوم ببناء تطبيق تجريبي بسيط يحاكي تطبيقًا فعليًا.

أولاً ، قم بإنشاء مجلد مشروع وانتقل إليه عن طريق تشغيل الأمر التالي:

mkdir demoapp && cd demoapp

بعد ذلك ، قم بتهيئة npm في دليل المشروع عن طريق تشغيل:

npm الحرف الأول

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

instagram viewer
  • يعبر: Express هو إطار عمل Node.js يوفر مجموعة قوية من الميزات لتطبيقات الويب والجوال. يجعل Express من السهل إنشاء تطبيقات الخلفية باستخدام Node.js.
  • جوي: Joi هي مكتبة للتحقق من صحة البيانات لـ Node.js.

تثبيت التبعيات مع مدير حزمة العقدة عن طريق تشغيل الأمر أدناه:

npm تثبيت سريع جوي

بعد ذلك ، قم بإنشاء ملف index.js ملف في الدليل الجذر الخاص بك وإضافة كتلة التعليمات البرمجية التالية إليه:

مقدار ثابت صريح = يتطلب("يعبر");
مقدار ثابت جهاز التوجيه = يتطلب("./routes");
مقدار ثابت المنفذ = 3000;

مقدار ثابت التطبيق = صريح () ؛

app.use (express.json ()) ؛
app.use (express.urlencoded ({ ممتد: حقيقي }));
app.use (جهاز التوجيه) ؛

app.listen (المنفذ ، () => {
وحدة التحكم.سجل("التطبيق يستمع على المنفذ 3000!");
});

تقوم كتلة التعليمات البرمجية أعلاه بإعداد خادم Express بسيط. يقوم بتكوين البرامج الوسيطة لتحليل بيانات الطلبات الواردة ومعالجة الطلبات الواردة ويبدأ الخادم في الاستماع للطلبات الواردة على المنفذ 3000.

طلبات التوجيه والمعالجة

للتبسيط ، ستقوم بإنشاء برمجية وسيطة لمعالج الطلب تقوم بإرجاع رمز الحالة ، جنبًا إلى جنب مع نص الطلب ، كاستجابة لكل طلب يحاول إرسال البيانات إلى التطبيق الخاص بك.

إنشاء handler.js ملف في الدليل الجذر لمشروعك وأضف مقطع التعليمات البرمجية أدناه:

مقدار ثابت demoHandler = (مطلوب ، الدقة ، التالي) => {
res.send ({
شفرة: 201,
البيانات: req.body ،
});
التالي()؛
};

وحدة.exports = demoHandler؛

بعد ذلك ، قم بإنشاء ملف router.js ملف في الدليل الجذر لمشروعك وأضف مقطع التعليمات البرمجية أدناه إلى ملفك:

مقدار ثابت صريح = يتطلب("يعبر");
مقدار ثابت demoHandler = يتطلب("./handler");
مقدار ثابت جهاز التوجيه = صريح. جهاز التوجيه () ؛

router.post ("/اشتراك"، demoHandler) ؛

وحدة.exports = جهاز التوجيه ؛

إنشاء مخطط جوي

يمثل مخطط Joi البنية المتوقعة وقواعد التحقق من الصحة لكائن بيانات محدد.

لإنشاء مخطط Joi ، يمكنك استخدام ملحق Joi.object () الطريقة وسلسلة قواعد التحقق المختلفة التي يعرضها Joi لتحديد متطلبات البنية والتحقق من صحة بياناتك.

على سبيل المثال:

مقدار ثابت exampleSchema = Joi.object ({
الاسم: Joi.string (). min (3).مطلوب()،
});

يصف المثال أعلاه مخطط Joi البسيط بامتداد اسم ملكية. ال اسم الخاصية لها قيمة Joi.string (). min (3). مطلوب (). هذا يعني أن ملف اسم يجب أن تكون القيمة عبارة عن سلسلة ، بطول لا يقل عن 3 أحرف ، وهي مطلوبة.

باستخدام Joi ، يمكنك ربط عدة طرق لإضافة المزيد من قيود التحقق لكل حقل محدد في مخططك.

فيما يلي مثال بمزيد من الحقول وقيود التحقق من الصحة:

مقدار ثابت userSchema = Joi.object ({
البريد الإلكتروني: Joi.string (). email (). required ()،

كلمة المرور: Joi.string (). min (6).مطلوب()،

العمر: Joi.number (). min (18).خياري()،

الموظف: Joi.boolean (). اختياري () ،

الهاتف: Joi.string ()
.regex (/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.مطلوب()،

العنوان: Joi.object ({
الشارع: Joi.string (). min (3).مطلوب()،
المدينة: Joi.string (). min (3).مطلوب()،
الحالة: Joi.string (). min (3).مطلوب()،
الرمز البريدي: Joi.number (). min (3).مطلوب()،
}).مطلوب()،

 الهوايات: Joi.array (). items (Joi.string ()). required ()،

}).خيارات({ إجهاض مبكر: خطأ شنيع });

ال userSchema يحدد القيود التالية لكل خاصية:

  • بريد إلكتروني: يجب أن تكون سلسلة بريد إلكتروني صالحة.
  • كلمة المرور: يجب أن تكون سلسلة مكونة من 6 أحرف على الأقل.
  • عمر: رقم اختياري بقيمة لا تقل عن 18.
  • يعمل: قيمة منطقية اختيارية.
  • هاتف: سلسلة مطلوبة تطابق المحدد تعبير regex (/^\d{3}-\d{3}-\d{4}$/).
  • عنوان: كائن يمثل عنوان المستخدم بالخصائص الفرعية التالية.
    • شارع: سلسلة مطلوبة بحد أدنى 3 أحرف.
    • مدينة: سلسلة مطلوبة بحد أدنى 3 أحرف.
    • ولاية: سلسلة مطلوبة بحد أدنى 3 أحرف.
    • أَزِيز: رقم مطلوب بحد أدنى 3.
  • هوايات: مصفوفة مطلوبة من السلاسل.

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

التحقق من صحة البيانات مع Joi

إنشاء Validation.js ملف وإضافة userSchema رمز لها.

مثل ذلك:

//validation.js
مقدار ثابت جوي = يتطلب("جوي");

مقدار ثابت userSchema = Joi.object ({
//...
}).خيارات({ إجهاض مبكر: خطأ شنيع });

وحدة.exports = userSchema ؛

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

مقدار ثابت ValidationMiddleware = (مخطط) => {
يعود(مطلوب ، الدقة ، التالي) => {
مقدار ثابت {error} = schema.validate (req.body) ،

لو (خطأ) {
// معالجة خطأ التحقق من الصحة
وحدة التحكم.log (error.message) ؛

res.status (400) .json ({ أخطاء: تفاصيل الخطأ })؛
} آخر {
// البيانات صالحة ، انتقل إلى البرامج الوسيطة التالية
التالي()؛
}
};
};

عند تقديم طلب ، تستدعي البرامج الوسيطة امتداد التحقق من صحة طريقة مخطط للتحقق من صحة نص الطلب. في حالة حدوث أي أخطاء في التحقق من الصحة ، ترسل البرامج الوسيطة ملف 400 طلب سىء مع رسائل الخطأ المستخرجة من تفاصيل خطأ التحقق من الصحة.

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

أخيرًا ، قم بتصدير ملف التحقق من الصحة و userSchema.

وحدة.exports = {
userSchema ،
التحقق من الصحة
};

اختبار قيود التحقق من الصحة

يستورد التحقق من الصحة و userSchema الدخول الى حسابك router.js ملف وإعداد البرامج الوسيطة مثل:

مقدار ثابت {validationMiddleware، userSchema} = يتطلب("./تصديق");

router.post ("/اشتراك"، ValidationMiddleware (userSchema) ، demoHandler) ؛

ابدأ التطبيق الخاص بك عن طريق تشغيل الأمر أدناه:

العقدةفِهرِس.js

بعد ذلك ، قم بتقديم طلب HTTP POST إلى المضيف المحلي: 3000 / تسجيل باستخدام بيانات الاختبار أدناه. يمكنك تحقيق ذلك باستخدام cURL أو أي عميل API آخر.

{
"بريد إلكتروني": "user @ example", // تنسيق بريد إلكتروني غير صالح
"كلمة المرور": "يمر", // طول كلمة المرور أقل من 6 أحرف
"عمر": 15, // العمر أقل من 18 عامًا
"موظف": حقيقي,
"هوايات": ["قراءة", "جري"],
"هاتف": "123-456-789", // تنسيق رقم الهاتف غير صالح
"عنوان": {
"شارع": "123",
"مدينة": "مثال المدينة",
"ولاية": "حالة المثال",
"أَزِيز": 12345
}
}

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

تبسيط التحقق من صحة البيانات باستخدام Joi

غطيت هنا معظم أساسيات التحقق من صحة البيانات باستخدام Joi. ومع ذلك ، يمكنك تغطية المزيد من التقنيات والقيود المتقدمة في وثائق Joi.

يبسط Joi مهمة التحقق من صحة البيانات في JavaScript ، مما يوفر حلاً بديهيًا يحسن بشكل كبير موثوقية وسلامة البيانات المخزنة في تطبيقك.