پذیرش داده های آزمایش نشده و تایید نشده در یک برنامه وب می تواند باعث آسیب پذیری های امنیتی شود و مشکلات پیش بینی نشده از داده های نامعتبر ایجاد شود.
پذیرش داده های آزمایش نشده و تایید نشده در یک برنامه وب می تواند باعث آسیب پذیری های امنیتی شود و مشکلات پیش بینی نشده از داده های نامعتبر ایجاد شود.
ORM های Node.js، مانند Sequelize و TypeORM، به شما امکان می دهند قوانین اعتبارسنجی را خارج از جعبه در سطح برنامه تنظیم کنید. در طول توسعه API، دادهها از درخواستهای HTTP به نقاط پایانی خاصی میآیند. این در سطح درخواست اتفاق می افتد. بنابراین، اعتبار سنجی پیش فرض ارائه شده توسط ORM ها برای آنها اعمال نمی شود.
Joi یک توصیف طرح و اعتباردهنده داده برای جاوا اسکریپت است. در اینجا، نحوه استفاده از کتابخانه اعتبارسنجی Joi برای اعتبارسنجی داده ها در سطح درخواست را خواهید آموخت.
راه اندازی پروژه آزمایشی
برای نشان دادن اینکه Joi چگونه داده ها را اعتبار می دهد، یک برنامه آزمایشی ساده می سازید که یک برنامه واقعی را تقلید می کند.
ابتدا یک پوشه پروژه ایجاد کنید و با اجرای دستور زیر وارد آن شوید:
mkdir demoapp && cd demoapp
سپس، npm را در فهرست پروژه خود با اجرای:
npm init -y
در مرحله بعد، باید برخی از وابستگی ها را نصب کنید. وابستگی های مورد نیاز برای این آموزش شامل موارد زیر است:
- Express: Express یک چارچوب Node.js است که مجموعه ای قوی از ویژگی ها را برای برنامه های کاربردی وب و موبایل ارائه می دهد. Express ساخت برنامه های کاربردی باطن را با Node.js آسان تر می کند.
- Joi: Joi یک کتابخانه اعتبارسنجی داده برای Node.js است.
با اجرای دستور زیر، وابستگی ها را با مدیر بسته گره نصب کنید:
npm install express joi
سپس یک فایل index.js را در دایرکتوری ریشه خود ایجاد کنید و بلوک کد زیر را به آن اضافه کنید:
const express = require("express");
const router = require("./routes");
const port = 3000;
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(router);
app.listen(port, () => {
console.log("app listening on port 3000!");
});
بلوک کد بالا یک سرور Express ساده را راه اندازی می کند. میانافزار را برای تجزیه دادههای درخواست ورودی و رسیدگی به درخواستهای دریافتی پیکربندی میکند و سرور را شروع میکند تا به درخواستهای ورودی در پورت 3000 گوش دهد.
مسیریابی و رسیدگی به درخواست ها
برای سادگی، یک میانافزار کنترلکننده درخواست ایجاد میکنید که یک کد وضعیت را همراه با بدنه درخواست، به عنوان پاسخی به هر درخواستی که سعی در ارسال داده به برنامه شما دارد، برمیگرداند.
یک فایل handler.js در دایرکتوری ریشه پروژه خود ایجاد کنید و بلوک کد زیر را اضافه کنید:
const demoHandler = (req, res, next) => {
res.send({
code: 201,
data: req.body,
});
next();
};
module.exports = demoHandler;
سپس، یک فایل router.js در دایرکتوری ریشه پروژه خود ایجاد کنید و بلوک کد زیر را به فایل خود اضافه کنید:
const express = require("express");
const demoHandler = require("./handler");
const router = express.Router();
router.post("/signup", demoHandler);
module.exports = router;
ایجاد یک طرحواره جوی
یک طرحواره Joi ساختار مورد انتظار یک شی داده خاص و قوانین اعتبار سنجی را نشان می دهد.
برای ایجاد یک طرحواره Joi، میتوانید از روش Joi.object() استفاده کنید و قوانین اعتبارسنجی مختلفی را که توسط Joi در معرض دید قرار گرفته است برای تعریف ساختار و الزامات اعتبارسنجی برای دادههای خود استفاده کنید.
به عنوان مثال:
const exampleSchema = Joi.object({
name: Joi.string().min(3).required(),
});
مثال بالا یک طرحواره Joi ساده با ویژگی نام را توصیف می کند. ویژگی name دارای مقدار Joi.string().min(3).required(). این بدان معناست که مقدار نام باید یک رشته با حداقل طول 3 کاراکتر باشد و لازم است.
با استفاده از Joi، میتوانید روشهای مختلفی را زنجیرهای کنید تا محدودیتهای اعتبارسنجی بیشتری به هر فیلد تعریفشده در طرحواره خود اضافه کنید.
در اینجا یک مثال با زمینه های بیشتر و محدودیت های اعتبار سنجی آورده شده است:
const userSchema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().min(6).required(),
age: Joi.number().min(18).optional(),
employed: Joi.boolean().optional(),
phone: Joi.string()
.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.required(),
address: Joi.object({
street: Joi.string().min(3).required(),
city: Joi.string().min(3).required(),
state: Joi.string().min(3).required(),
zip: Joi.number().min(3).required(),
}).required(),
hobbies: Joi.array().items(Joi.string()).required(),
}).options({ abortEarly: false });
userSchema محدودیت های زیر را برای هر ویژگی تعریف می کند:
- ایمیل: باید یک رشته ایمیل معتبر باشد.
- رمز عبور: باید رشته ای با حداقل 6 کاراکتر باشد.
- سن: یک عدد اختیاری با حداقل مقدار 18.
- employed: یک بولی اختیاری.
- تلفن: یک رشته مورد نیاز که با عبارت regex مشخص شده مطابقت دارد (/^\d{3}-\d{3}-\d{4}$/).
- آدرس: یک شی که نشان دهنده آدرس کاربر با خصوصیات فرعی زیر است.street: یک رشته مورد نیاز با حداقل طول 3 کاراکتر. city: یک رشته مورد نیاز با حداقل طول 3 کاراکتر. state: یک رشته مورد نیاز با حداقل طول 3 کاراکتر. zip: یک عدد مورد نیاز با حداقل مقدار 3.
- سرگرمی ها: یک آرایه مورد نیاز از رشته ها.
- street: یک رشته مورد نیاز با حداقل طول 3 کاراکتر.
- city: یک رشته مورد نیاز با حداقل طول 3 کاراکتر.
- state: یک رشته مورد نیاز با حداقل طول 3 کاراکتر.
- zip: یک عدد مورد نیاز با حداقل مقدار 3.
علاوه بر محدودیت ها، userSchema گزینه aborTEarly را روی false قرار می دهد. به طور پیش فرض، Joi به محض مواجه شدن با اولین خطا، اجرای برنامه را متوقف می کند و خطا را در کنسول چاپ می کند. با این حال، تنظیم این گزینه روی false تضمین می کند که Joi کل طرحواره را بررسی می کند و تمام خطاهای مواجه شده را در کنسول چاپ می کند.
اعتبارسنجی داده ها با Joi
یک فایل validation.js ایجاد کنید و کد userSchema را به آن اضافه کنید.
اینطوری:
//validation.js
const Joi = require("joi");
const userSchema = Joi.object({
//...
}).options({ abortEarly: false });
module.exports = userSchema;
سپس، یک میانافزار ایجاد کنید که بارهای درخواستی را رهگیری میکند و با افزودن کد زیر در زیر کد userSchema، آنها را در برابر طرح ارائهشده تأیید میکند.
const validationMiddleware = (schema) => {
return (req, res, next) => {
const { error } = schema.validate(req.body);
if (error) {
// Handle validation error
console.log(error.message);
res.status(400).json({ errors: error.details });
} else {
// Data is valid, proceed to the next middleware
next();
}
};
};
هنگامی که یک درخواست انجام می شود، میان افزار از روش اعتبارسنجی طرحواره برای تأیید اعتبار بدنه درخواست استفاده می کند. اگر هر گونه خطای اعتبارسنجی رخ دهد، میان افزار یک پاسخ درخواست بد 400 با پیام های خطا استخراج شده از جزئیات خطای اعتبارسنجی ارسال می کند.
از طرف دیگر، اگر اعتبارسنجی بدون خطا انجام شود، میان افزار تابع ()next را فراخوانی می کند.
در نهایت، اعتبارسنجیMiddleware و userSchema را صادر کنید.
module.exports = {
userSchema,
validationMiddleware,
};
تست محدودیت های اعتبار سنجی
اعتبارسنجیMiddleware و userSchema را در فایل router.js خود وارد کنید و میان افزار را به این صورت تنظیم کنید:
const { validationMiddleware, userSchema } = require("./validation");
router.post("/signup", validationMiddleware(userSchema), demoHandler);
برنامه خود را با اجرای دستور زیر شروع کنید:
node index.js
سپس، با استفاده از داده های تست زیر، یک درخواست HTTP POST به localhost:3000/signup ارسال کنید. شما می توانید با استفاده از cURL یا هر سرویس گیرنده API دیگری به این هدف برسید.
{
"email": "user@example", // Invalid email format
"password": "pass", // Password length less than 6 characters
"age": 15, // Age below 18
"employed": true,
"hobbies": ["reading", "running"],
"phone": "123-456-789", // Invalid phone number format
"address": {
"street": "123",
"city": "Example City",
"state": "Example State",
"zip": 12345
}
}
این درخواست با شکست مواجه میشود و یک شی خطا برمیگرداند، زیرا بارگذاری حاوی بسیاری از فیلدهای نامعتبر است، مانند ایمیل، رمز عبور، سن و تلفن. با استفاده از شی خطای ارائه شده، می توانید خطاها را به طور مناسب مدیریت کنید.
ساده سازی اعتبارسنجی داده ها با Joi
در اینجا شما بیشتر اصول اولیه اعتبارسنجی داده ها را با استفاده از Joi پوشش دادید. با این حال، میتوانید تکنیکها و محدودیتهای پیشرفتهتری را در مستندات Joi پوشش دهید.
Joi کار اعتبارسنجی داده ها را در جاوا اسکریپت ساده می کند و راه حلی بصری ارائه می دهد که به طور قابل توجهی قابلیت اطمینان و یکپارچگی داده های ذخیره شده در برنامه شما را بهبود می بخشد.