امنیت API؛ مسئولیتی که نباید به بعد موکول شود
API قلب تپندهی اپلیکیشنهای امروزی است؛ وبسایت، اپلیکیشن موبایل و حتی سرویسهای دیگر از طریق آن به دادهها دسترسی دارند. همین موضوع آن را به هدف اصلی مهاجمان تبدیل میکند. طبق گزارشهای OWASP API Security Top 10، بیشتر نفوذها نه بهدلیل باگهای پیچیده، بلکه بهخاطر اشتباهات سادهای مثل بررسی نکردن دسترسی یا اعتماد به ورودی کاربر رخ میدهند.
در این مقاله یک چکلیست کاربردی برای ایمنسازی REST API با Node.js ارائه میکنم.

۱. احراز هویت درست
- رمزها را هش کنید: از
bcryptیاargon2استفاده کنید؛ هرگز رمز را بهصورت ساده یا با MD5 ذخیره نکنید. - توکن کوتاهمدت: عمر JWT را کوتاه نگه دارید و برای تمدید از Refresh Token استفاده کنید.
- کوکی امن: توکن نشست را در کوکی با ویژگیهای
HttpOnly،SecureوSameSiteذخیره کنید تا از دسترس جاوااسکریپت مخرب دور بماند. - ورود دومرحلهای: برای حسابهای مدیریتی، کد یکبارمصرف پیامکی یا اپلیکیشن احراز هویت را فعال کنید.
۲. بررسی مجوز در هر درخواست
خطرناکترین آسیبپذیری API، BOLA است: کاربر شناسهی منبع را در آدرس تغییر میدهد و به دادهی شخص دیگری دسترسی پیدا میکند. هرگز فقط به وارد شدن کاربر اکتفا نکنید؛ مالکیت منبع را هم بررسی کنید:
app.get("/api/invoices/:id", requireAuth, async (req, res) => {
const invoice = await prisma.invoice.findFirst({
where: {
id: Number(req.params.id),
customerId: req.user.id, // فقط فاکتورهای خود کاربر
},
})
if (!invoice) return res.status(404).json({ error: "یافت نشد" })
res.json(invoice)
})دقت کنید که بهجای خطای ۴۰۳، خطای ۴۰۴ برگردانده شده تا وجود منبع برای مهاجم فاش نشود.

۳. هرگز به ورودی کاربر اعتماد نکنید
هر دادهای که از بیرون میآید — Body، Query، Header و حتی نام فایل — باید اعتبارسنجی شود. کتابخانهی Zod این کار را ساده و Type-Safe میکند:
import { z } from "zod"
const CreateComment = z.object({
postId: z.number().int().positive(),
body: z.string().trim().min(2).max(2000),
})
app.post("/api/comments", requireAuth, async (req, res) => {
const parsed = CreateComment.safeParse(req.body)
if (!parsed.success) {
return res.status(422).json({ error: "دادهی نامعتبر" })
}
// ادامه با parsed.data
})استفاده از ORM یا کوئریهای پارامتری، جلوی SQL Injection را میگیرد. در آپلود فایل هم فقط به پسوند اعتماد نکنید و بایتهای ابتدایی فایل را بررسی کنید.
۴. محدودیت نرخ درخواست
بدون Rate Limiting، مهاجم میتواند هزاران رمز را امتحان کند یا با ارسال درخواستهای زیاد، سرور و هزینهی پیامک شما را از بین ببرد:
import rateLimit from "express-rate-limit"
app.use("/api/auth", rateLimit({
windowMs: 15 * 60 * 1000,
limit: 10,
standardHeaders: true,
}))
۵. هدرها، CORS و خطاها
- Helmet: با یک خط، هدرهای امنیتی مهمی مثل
X-Content-Type-OptionsوStrict-Transport-Securityتنظیم میشوند. - CORS محدود: بهجای
*، فقط دامنههای مجاز را در فهرستoriginقرار دهید. - پیام خطای عمومی: Stack Trace و جزئیات پایگاه داده را هرگز در پاسخ production برنگردانید.
- HTTPS اجباری: همهی درخواستها باید رمزنگاریشده باشند؛ حتی در شبکهی داخلی.
۶. لاگ و پایش
امنیت فقط پیشگیری نیست؛ تشخیص هم مهم است. تلاشهای ناموفق ورود، خطاهای ۴۰۱ و ۴۰۳ پرتکرار و درخواستهای غیرعادی را ثبت کنید، اما مراقب باشید رمز، توکن یا اطلاعات شخصی کاربران وارد لاگها نشود.

جمعبندی
امنیت API یک ویژگی نیست که در پایان پروژه اضافه شود؛ بلکه باید از اولین Endpoint در نظر گرفته شود. احراز هویت درست، بررسی مالکیت در هر درخواست، اعتبارسنجی ورودی و محدودیت نرخ، چهار ستون اصلی هستند که بیشتر حملات رایج را خنثی میکنند. این چکلیست را پیش از هر انتشار مرور کنید.

دیدگاهها
هنوز دیدگاهی ثبت نشده است. اولین نفر باشید!