نحوه جلوگیری از حملات Web API با اعتبارسنجی داده – راهنمای امنیت Web API
حفاظت کافی از داده ها و محرمانه بودن کاربر از مسئولیت های کلیدی توسعه دهندگان وب است. از این رو، اطمینان از بالاترین امنیت ممکن در هنگام ساخت نقاط پایانی API مهم است.
عمل امنیت برنامه یک مسئولیت مشترک بین توسعه دهندگان سرویس گیرنده و سرور است و بی توجهی به نقش خود می تواند فاجعه بار باشد. آمارها نشان می دهد که نقض داده ها در سال 2023 منجر به افشای بیش از 8 میلیون رکورد داده در سراسر جهان شده است.
در این مقاله، حوزههای کلیدی امنیت API را که شامل اعتبارسنجی دادهها میشود، برجسته میکنم. این مفهوم برای کمک به محافظت از API خود در برابر حملات وب از طریق داده های کاربر مخرب بسیار مهم است. این آموزش برای همه توسعه دهندگان بک اند صرف نظر از سال ها تجربه مناسب است.
برای اینکه بتوانید این آموزش را دنبال کنید، در اینجا چند پیش نیاز وجود دارد:
آشنایی با Node.js
آشنایی با npm و نصب پکیج
با وجود آن، بیایید شروع کنیم.
اعتبار سنجی داده ها چگونه کار می کند؟
اول از همه، اعتبار سنجی داده ها چیست؟ اعتبارسنجی داده ها به سادگی مستلزم اطمینان از صحت و قابلیت اطمینان داده های دریافت شده از منابع خارجی قبل از پردازش بعدی است.
این یک جزء کلیدی امنیت وب API است زیرا برای جلوگیری از وقوع حملات تزریق وب، حملات SQL و حملات NoSQL ضروری است. برای دانستن بیشتر در مورد این موارد، می توانید این لینک را تحلیل کنید.
توجه داشته باشید که اعتبار سنجی داده ها مورد نیاز است اما به عملیات پشتیبان زیر محدود نمی شود.:
ورود کاربر و ثبت نام
پرسش پاسخ
به روز رسانی پایگاه داده های سرور
همه اینها می توانند به عنوان راه هایی توسط هکرهای کلاه سیاه بدجنس برای دسترسی به پایگاه داده سرور و به دست آوردن جزئیات حساس کاربر یا حتی ایجاد خرابی با قالب بندی کل پایگاه داده استفاده شوند.
ابزارهای محبوب اعتبارسنجی داده ها
تا کنون، ابزارهای زیادی وجود دارد که می تواند به برنامه نویس کمک کند تا به اعتبارسنجی داده کارآمد در توسعه API دست یابد.
آنها به شما کمک می کنند تا از اختراع مجدد چرخ استفاده از کد regex طولانی برای اعتبارسنجی داده ها جلوگیری کنید. آنها بسیاری از ویژگی ها، از جمله مدیریت خطا و قابلیت های سفارشی سازی اعتبار را ارائه می دهند.
برخی از این ابزارها عبارتند از:
• Joi
• زود
• آره
• AJv
• Valibot
• Validator.js
• Superstruct
برای روشن کردن بیشتر این ابزارها، ما برخی از محبوب ترین ابزارهای اعتبارسنجی داده را که در بالا ذکر شد مقایسه می کنیم.
مزایا و معایب ابزارهای اعتبارسنجی داده ها
برای آگاهی بیشتر شما در مورد این ابزارهای اعتبار سنجی جاوا اسکریپت، برخی از مزایا و معایب سه مورد از این ابزارهای معتبر اعتبار سنجی جاوا اسکریپت را برجسته می کنم.
جوی
طرفداران
دارای یک جامعه کاربری قوی و بزرگ و پشتیبانی توسعه است
دارای قابلیت های داخلی برای رسیدگی به اعتبارسنجی های پیچیده است
منفی
نحو آن کاملاً پرمخاطب است
زود
طرفداران
به راحتی با پروژه های Typescript سازگار است
دارای قابلیت مدیریت خطا کارآمد است
منفی
اعتبار سنجی غیر همگام پشتیبانی نمی شود.
آره
طرفداران
این عمدتاً از نحو اظهاری برای تنظیم ابزار اعتبار سنجی خود استفاده می کند که سادگی آن را می دهد
عملکرد سریع قابل مقایسه ای دارد.
منفی
ویژگی های سفارشی سازی را ارائه نمی دهد
توانایی محدودی برای رسیدگی به اعتبارسنجی های پیچیده دارد
برای هدف این آموزش، از Joi به عنوان ابزار اعتبارسنجی داده ها استفاده می کنیم.
مقدمه ای بر جوی
Joi یک ابزار ساده و کارآمد اعتبارسنجی داده مبتنی بر جاوا اسکریپت است که بر اساس پیکربندی نوع طرحواره است.
دارای قابلیتهای داخلی برای تأیید وقوع دادهها در اشکال مختلف است، اما به Booleans، رشتهها، توابع و فواصل محدود نمیشود. همچنین می تواند عملیات اعتبار سنجی پیچیده را انجام دهد.
علاوه بر این، حداقل قابلیت های کش را فراهم می کند. اطلاعات بیشتر در مورد ابزار را می توانید در اینجا بیابید.
نحوه تنظیم Joi
در این بخش، Joi را در محیط محلی خود راه اندازی می کنیم. برای نصب Joi، از طریق خط فرمان به پوشه کد بروید و این را اجرا کنید:
npm i joi
یک پیام تایید کننده نصب موفقیت آمیز باید نمایش داده شود. با تکمیل آن، میتوانیم قدرت Joi را در تأیید ثبت نام کاربر در API آزمایشی خود نشان دهیم.
پروژه نمایشی
در این پروژه، شما از Joi برای اعتبارسنجی ورودی دریافتی از مشتری با هدف ثبت نام در سرور استفاده خواهید کرد. کد پیشفرض تابع ثبت نام کاربر برای برنامه Node.js را میتوانید در اینجا بیابید.
ادامه دهید و بسته Joi نصب شده را در کد خود وارد کنید:
const Joi = require("joi");
قبل از نوشتن کنترلر ثبت نام، کتابخانه Joi را در فایل کد مقداردهی اولیه می کنیم:
const SignUpSchema = Joi.object({});
در این پروژه، پارامترهای ایمیل، رمز عبور و نام کاربری دریافتی از مشتری را تایید می کنیم.
const SignUpSchema = Joi.object({ email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } }), username: Joi.string().alphanum().min(3).max(15).required(), password: Joi.string().min(8).required() });
شی پارامتر ایمیل تضمین می کند که آدرس ایمیل یک رشته است و سایت دامنه به .com و .net محدود می شود و سایر اشکال دامنه را ممنوع می کند.
برای پارامتر نام کاربری، تضمین میکند که رشتهای حاوی حروف و اعداد با حداقل تعداد کاراکتر 3 و حداکثر تعداد کاراکتر 15 است. تایید شده است.
پارامتر رمز عبور تضمین می کند که رمز عبور ارائه شده در قالب رشته ای با حداقل تعداد کاراکتر 8 باشد و همچنین لازم است.
برای اعمال آن در نقاط انتهایی خود، این را در تابع کنترلر قرار می دهیم:
const { error, value } = SignUpSchema.validate(req.body, { abortEarly: false }); if (error) { res.status(400).json(error.details); return; }
این تابع قبل از درج جزئیات کاربر در پایگاه داده اجرا می شود. طرحواره سعی می کند ورودی دریافتی را تایید کند و در صورت موفقیت آمیز بودن اعتبار به پایگاه داده می رود.
ویژگی abortEarly
گنجانده شده است تا امکان ارزیابی همه پارامترها را فراهم کند. تمام خطاها در صورت وجود نمایش داده می شوند.
موارد فوق را می توان در عملکرد کنترل کننده ورود نیز تکرار کرد. همچنین میتوانید مستندات را برای نمونههای دیگر گزینههای اعتبارسنجی پیچیده با استفاده از Joi تحلیل کنید.
کد نهایی پروژه در زیر نمایش داده می شود:
const jwt = require("jsonwebtoken"); const userSchema = require("../Schema/User"); const Joi = require("joi"); const bcrypt = require("bcrypt"); const { createNewColumn, checkRecordsExists, insertRecord } = require('../utils/sqlSchemaFunction'); const generateAccessToken = (use) => { return jwt.sign({ userID: use }, process.env.JWT, { expiresIn: "1d" }); } const SignUpSchema = Joi.object({ email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } }), username: Joi.string().alphanum().min(3).max(15).required(), password: Joi.string().min(8).required() }); const loginSchema = Joi.object({ email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } }), password: Joi.string().min(8).required() }); const register = async (req, res) => { const email = req.body.email; const password = req.body.password; if (!email || !password) { res.status(400).json("Please supply the email or password"); return; } const { error, value } = SignUpSchema.validate(req.body, { abortEarly: false }); if (error) { res.status(400).json(error.details); return; } const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(password, salt); const user = { username: req.body.username, email: email, password: hashedPassword }; try { const userAlreadyExists = await checkRecordsExists("users", "email", email); if (userAlreadyExists) { res.status(400).json("Email must be unique"); } else { await insertRecord("users", user); res.status(200).json("User created successfully"); } } catch (err) { res.status(500).json({ err: err.message }); } }; module.exports = { register };
اطمینان از اینکه کد از شمای تعریف شده ما پیروی می کند، منجر به اجرای موفقیت آمیز آن شد.
نتیجه
با این کار به پایان آموزش رسیدیم. امیدوارم در مورد اعتبارسنجی داده ها، ابزارهای مختلف اعتبارسنجی داده ها و بهترین شیوه های اعتبارسنجی داده ها یاد گرفته باشید.
همچنین می توانید با من تماس بگیرید و مقالات دیگر من را در اینجا تحلیل کنید. تا دفعه بعد، به کدنویسی ادامه دهید!
ارسال نظر