English | 繁中版 | 简中版 | العربية | Azərbaycan | Български | বাংলা | Català | Čeština | Deutsch | Ελληνικά | Español | Français | हिंदी | Indonesia | Italiano | 日本語 | 한국어 | ພາສາລາວ | Македонски | മലയാളം | Монгол | Nederlands | Polski | Português (Brasil) | Русский | ไทย | Türkçe | Українська | Tiếng Việt
چکلیستی از مهمترین کارهای لازم برای حفظ امنیت در زمان طراحی، تست و انتشار API.
- از
Basic Authیا هماناصالتسنجی برای دسترسیهای اولیهاستفاده نکنید. به جای آن از روشهای استاندارد احراز هویت استفاده کنید. - برای کارهایی مثل
احراز هویت،تولید توکنوذخیره پسووردچرخ را دوباره اختراع نکنید. از استانداردها استفاده کنید. - برای لاگین محدودیتهای
تعداد ماکسیمم تلاش مجددو تعداد دفعات ورود را قرار بدید. - همهی دادههای حساس را رمزگذاری کنید.
- رکوئستها را محدود کنید (Throttling) تا از حملات DDos یا بروتفورس جلوگیری شود.
- در سمت سرور از HTTPS استفاده کنید تا از حملات مرد میانی جلوگیری شود.
- از هدر
HSTSاستفاده کنید تا از حملهی SSL Strip جلوگیری شود. - لیست های دایرکتوری را خاموش کنید.
- برای APIهای خصوصی، فقط از IPها/میزبانهای لیست سفید اجازه دسترسی داشته باشید.
- همیشه
redirect_uriرا در سمت سرور اعتبارسنجی کنید تا تنها به URLهای مجاز اجازه داده شود. - همیشه تلاش کنید تا code را به جای token تبادل کنید (اجازه
response_type=tokenرا ندهید). - از پارامتر
stateبا یک هش تصادفی استفاده کنید تا از CSRF روی پروسهی احراز هویت OAuth جلوگیری کنید. - مقدار scope پیشفرض را تعریف کنید و پارامترهای scope را برای هر اپلیکیشن اعتبارسنجی کنید.
- از متد HTTP مناسب با توجه به نوع عملیات استفاده کنید:
GETبرای خواندن،POSTبرای ایجاد کردن،PUT/PATCHبرای جایگزین یا بروزرسانی وDELETEبرای حذف یک رکورد، و در صورتیکه متد درخواستی برای منبع درخواستشده مناسب نباشد با405 Method Not Allowedپاسخ بدهید. - مقدار
content-typeرا در هدر Accept رکوئست (مذاکره محتوا یا Content Negotiation) اعتبارسنجی کنید تا فقط به فرمتهای مورد پشتیبانی اجازه داده شود (مثلاapplication/xml،application/jsonو ...). و در صورت عدم تطابق با یک پاسخ406 Not Acceptableپاسخ دهید. - مقدار
content-typeدر دادهی پستشده را اعتبارسنجی کنید (مثلاapplication/x-www-form-urlencoded،multipart/form-data،application/jsonو ...). - ورودی کاربر را اعتبارسنجی کنید تا از آسیبپذیریهای معمول جلوگیری شود (مثلا
XSS،SQL-InjectionوRemote Code Execution). - هیچ دادهی حساسی مثل (دادههای اعتبارسنجی، پسووردها، توکنهای امنیتی یا کلیدهای API) را داخل URL قرار ندهید و از هدر Authorization استاندارد استفاده کنید.
- فقط از رمزگذاری سمت سرور استفاده کنید.
- از یک سرویس API Gateway استفاده کنید تا کشکردن و سیاستهای Rate Limit (مثلا
Quota،Spike ArrestیاConcurrent Rate Limit) فعال شوند و منابع APIها را به صورت داینامیک دپلوی کنید.
- چک کنید که تمامی endpointها توسط احراز هویت محافظت شوند تا از پروسهی احراز هویت ناقص جلوگیری شود.
- از استفاده از ID ریسورس خود کاربر اجتناب کنید. به جای
user/654321/ordersاز/me/ordersاستفاده کنید. - از IDهای auto-increment استفاده نکنید. به جای آن از
UUIDاستفاده کنید. - اگر فایلهای XML را parse میکنید مطمئن شوید تا entity parsing غیرفعال باشد تا از
XXE(XML External entity attack) جلوگیری شود. - اگر فایلهای XML، YAML یا هر زبان دیگری را با استفاده از anchor ها و ref ها parse میکنید، مطمئن شوید تا entity expansion غیرفعال باشد تا از
Billion Laughs/XML bombتوسط exponential entity expansion attack جلوگیری شود. - از یک CDN برای آپلودهای فایل استفاده کنید.
- اگر با مقادیر بسیار حجیمی از داده سر و کار دارید، از Workerها و Queueها استفاده کنید تا حد الامکان پردازش در بکگراند انجام شود و سریع پاسخ را برگردانید تا از HTTP Blocking جلوگیری شود.
- خاموش کردن حالت DEBUG را فراموش نکنید.
- در صورت وجود از پشته های غیر قابل اجرا استفاده کنید.
- هدر
X-Content-Type-Options: nosniffرا ارسال کنید. - هدر
X-Frame-Options: denyرا ارسال کنید. - هدر
'Content-Security-Policy: default-src 'noneرا ارسال کنید. - هدرهایی که به نوعی اثرانگشت برجای میگذارند را حذف کنید، مثلا
X-Powered-By،Serverو X-AspNet-Version. - مقدار
content-typeرا برای پاسخ اجباری کنید. اگرapplication/jsonبرمیگردانید، پسcontent-typeپاسخ،application/jsonاست. - Do not return overly specific error messages to the client that could reveal implementation details, use generic messages instead, and log detailed information only on the server side.
- اطلاعات حساس مثل
دادههای اعتبارسنجی،رمز های عبوروتوکنهای امنیتیرا برنگردانید. - با توجه به عملیات انجامشده، status code مناسب را برگردانِد. مثلا
200 OK،400 Bad Request،401 Unauthorizedو405 Method Not Allowed.
- طراحی و پیاده سازی خودتان را با پوشش تستهای unit/integration بازرسی کنید.
- از یک پروسهی مرور کد استفاده کنید و خود-تاییدی را نادیده بگیرید.
- مطمئن شوید تا تمامی اجزای سرویسهایتان، شامل کتابخانههای استفادهشده و دیگر وابستگیها، قبل از انتشار در حالت production، به طور ایستا توسط نرمافزارهای آنتیویروس اسکن شدهاند.
- به صورت پیوسته روی کدتان تستهای امنیتی (آنالیز ایستا و پویا)، اجرا کنید.
- وابستگیهایتان (نرم افزار و سیستم عامل، هردو) را برای آسیبپذیریهای شناخته شده، چک کنید.
- برای دپلویهایتان، یک راهحل با قابلیت عقبگرد (rollback) طراحی کنید.
- از لاگین های متمرکز برای همه سرویس ها و مؤلفه ها استفاده کنید.
- از agent ها برای مانیتور همه ترافیک, خطاها, درخواستها و پاسخها استفاده کنید.
- از alert ها برای اس ام اس, Slack, ایمیل, Telegram, Kibana, Cloudwatch و غیره استفاده کنید.
- اطمینان حاصل کنید که هیچ گونه داده حساسی مانند کارت های اعتباری، رمزهای عبور، پین ها و غیره را ثبت نمی کنید.
- از یک سیستم IDS و/یا IPS برای مانیتور درخواست ها API و نمونه های خود استفاده کنید.
- yosriady/api-development-tools - یک مجموعه از منابع مفید برای ساختن APIهای RESTful با HTTP و JSON -
- You don't need JWT, just use a randomly generated API key. If you need asymmetric encryption or tamper prevention, here are some alternatives to JWT.
- Implement sliding window rate limiting per API key and IP.
- Use exponential backoff for repeated failed authentication attempts.
- Implement CAPTCHA or proof-of-work challenges after suspicious activity.
- Monitor and alert on unusual API usage patterns (time, volume, endpoints).
- Disable introspection in production environments.
- Implement query depth limiting to prevent nested query attacks.
- Use query cost analysis to prevent resource exhaustion.
- Whitelist allowed queries in production when possible.
- Rotate API keys and secrets on a regular schedule.
- Use hardware security modules (HSM) for signing operations.
- Implement secret scanning in CI/CD pipelines.
- Never commit secrets to version control - use environment variables or secret managers.
- Implement mutual TLS (mTLS) for service-to-service communication.
- Validate all requests even from internal services.
- Use short-lived tokens with automatic refresh.
- Implement request signing for sensitive operations.
برای همکاری و کمک میتوانید به راحتی این مخزن را fork کنید، تغییرات مورد نظرت را اعمال کنید و یک pull request ثب کنید. اگر سوالی داشتید به آدرس [email protected] ایمیل بزنید.