چک‌لیست امنیت REST API در Node.js

مهم‌ترین نکات ایمن‌سازی API: احراز هویت درست، جلوگیری از BOLA، اعتبارسنجی ورودی با Zod، محدودیت نرخ درخواست، CORS، هدرهای امنیتی و لاگ‌گیری.

چک‌لیست امنیت REST API در Node.js
زمان انتشار:
۴ شهریور ۱۴۰۵
زمان مطالعه:
حدود 3 دقیقه
نویسنده:
علیرضا مهدی زاده
دسته‌بندی:بک‌اند

امنیت 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,
}))

دست‌ها در حال یادداشت‌برداری کنار لپ‌تاپ؛ مستندسازی سیاست‌های امنیتی API

۵. هدرها، CORS و خطاها

  • Helmet: با یک خط، هدرهای امنیتی مهمی مثل X-Content-Type-Options و Strict-Transport-Security تنظیم می‌شوند.
  • CORS محدود: به‌جای *، فقط دامنه‌های مجاز را در فهرست origin قرار دهید.
  • پیام خطای عمومی: Stack Trace و جزئیات پایگاه داده را هرگز در پاسخ production برنگردانید.
  • HTTPS اجباری: همه‌ی درخواست‌ها باید رمزنگاری‌شده باشند؛ حتی در شبکه‌ی داخلی.

۶. لاگ و پایش

امنیت فقط پیشگیری نیست؛ تشخیص هم مهم است. تلاش‌های ناموفق ورود، خطاهای ۴۰۱ و ۴۰۳ پرتکرار و درخواست‌های غیرعادی را ثبت کنید، اما مراقب باشید رمز، توکن یا اطلاعات شخصی کاربران وارد لاگ‌ها نشود.

لپ‌تاپ، گوشی و کتاب روی میز روشن؛ بازبینی منظم امنیت پیش از هر انتشار

جمع‌بندی

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

دیدگاه‌ها

برای ثبت دیدگاه باید شماره موبایل خود را تأیید کنید.

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