English | 繁中版 | 簡中版 | Português (Brasil) | Français | 한국어 | Nederlands | Indonesia | ไทย | Русский | Українська | Español | Italiano | 日本語 | Deutsch | Türkçe | Tiếng Việt | Монгол | हिंदी | العربية | Polski | Македонски | ລາວ | Ελληνικά | فارسی
در این صفحه چک لیستی از موارد امنیتی API ها در هنگام طراحی، توسعه، تست و انتشار بررسی شده است.
- از احراز هویت پایه (
Basic Auth) استفاده نکنید، از روش های استاندارد نظیر JWT, OAuth استفاده کنید. - چرخ را دوباره اختراع نکنید، از روش های استاندارد احراز هویت (
Authentication)، تولید توکن (Token Generation) و ذخیره کلمه عبور (Password Storage) استفاده کنید. - از روش های
Max Retryو محدود کردن تعداد دفعات ورود استفاده کنید. - برای تمام داده های حساس از رمزنگاری استفاده کنید.
- از یک کلید تصادفی و پیچیده برای
JWT Secretاستفاده کنید تا حملهBrute Forceبر روی توکن بسیار سخت شود. - الگوریتم را از طریقه
Payloadباز نکنید، الگوریتم را در سمتBackendنگه دارید. (روشهای رمزنگاریHS256وRS256پیشنهاد میشود) - زمان عمر
Tokenرا (TTL,RTTL) تا حد امکان کوتاه تنظیم کنید. - اطلاعات حساس را در
JWT Payloadذخیره نکنید، در این حالت به راحتی قابل شکستن است.
- همیشه
redirect_uriرا در سمت سرور اعتبارسنجی کنید تا تنها آدرس های Whitelist دسترسی داشته باشند. - همیشه سعی کنید بجای Tokenها، code ها را تبادل کنید. هرگز اجازه ندهید
response_type=tokenباشد. - از پارامتر
stateبا یک هش تصادفی استفاده کنید تا جلوی حمله CSRF در فرآیند احرازهویت OAuth گرفته شود. - محدوده پیش فرض را مشخص کنید و برای هر برنامه، پارامترهای این محدوده را اعتبارسنجی کنید.
- درخواستها را محدود کنید (Throttling) تا جلوی حمله DDoS / Brute-Force گرفته شود.
- در سمت سرور از HTTPS استفاده کنید تا جلوی حمله مرد میانی (Man in the Middle) گرفته شود.
- از هدر
HSTSهمراه با SSL استفاده کنید تا جلوی حمله Strip گرفته شود.
- باتوجه به نوع عملیات، نوع هدر بسته HTTP را مشخص کنید. از متد
GETبرای خواندن، متدPOSTبرای ساختن، متدPUT/PATCHبرای جایگزینی یا آپدیت و متدDELETEبرای پاک کردن استفاده کنید و درخواست هایی که متد آنها مناسب نمیباشد را با کد405 Method Not Allowedپاسخ دهید. - مقدار پارامتر
content-typeهدر بستهها را اعتبارسنجی کنید تا تنها به نوع های مشخصapplication/xmlیاapplication/jsonو ... پاسخ دهد و درخواست های غیرمجاز را با406 Not Acceptableپاسخ دهید. - مقدار پارامتر
content-typeرا در متدPOSTاعتبارسنجی کنید تا مقادیری نظیرapplication/x-www-form-urlencoded،multipart/form-dataیاapplication/jsonو ... باشد. - مقدار ورودی ارسالی کاربر را اعتبارسنجی کنید تا از حملاتی نظیر
XSS،SQL-Injection،Remote Code Executionو ... جلوگیری شود. - از اطلاعات حساس نظیر
Crendetials،Passwords،Security TokensیاAPI Keysدر URL استفاده نکنید و از یکAuthorization Headerاستاندارد استفاده کنید. - از یک سرویس API Gateway استفاده کنید تا عملیاتی نظیر Caching یا سیاست های ایجاد محدودیت نظیر
Quota،Spike ArrestیاConcurrent Rate Limitرا انجام دهید و به صورت پویا منابع API ها را deploy کنید.
- تمام Endpoint های دارای عملیات احرازهویت را بررسی کنید تا فرآیند احرازهویت شکسته نشود.
- مقدار ID کاربران نباید نمایش داده شود. برای مثال بجای
/user/654321/ordersاز/me/ordersاستفاده کنید. - از مقادیر ID به صورت Auto-increment استفاده نکنید و بجای آن از
UUIDاستفاده کنید. - اگر XML Parsing انجام میدهید، اطمینان حاصل کنید عملیات Parsing توسط آسیب پذیری
XXE(XML external entity attack) قابل نفوذ نباشد. - اگر XML Parsing انجام میدهید، اطمینان حاصل کنید حمله هایی نظیر
Billion Laughs/XML bombصورت نگیرد. - برای آپلود فایلها از CDN یا شبکه توزیع محتوا استفاده کنید.
- اگر روی مقدار عظیمی از داده عملیات محاسباتی انجام میدهید، از Worker ها Queue ها استفاده کنید تا عملیات را تا حد امکان در پسزمینه انجام دهید و پاسخ را به سرعت برگردانید و از HTTP Blocking جلوگیری کنید.
- هرگز فراموش نکنید حالت DEBUG را OFF کنید.
- هدر
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باشد. - اطلاعات حساس نظیر
Credentials،PasswordsوSecurity Tokenها را ارسال نکنید. - باتوجه به نوع عملیات،
Status Codeمناسب برگردانید برای مثال200 OK،400 Bad Request،401 Unauthorized،405 Method Not Allowedو ...
- طراحی و پیاده سازی را باتوجه به پوشش Unit/Integration Test بازرسی کنید.
- از یک روند Code Review استفاده کنید و از Self-Approval خودداری کنید.
- اطمینان حاصل کنید تمام اجزای سرویس شما قبل از Push بر روی حالت Production توسط یک آنتی ویروس اسکن شده اند، از جمله کتابخانه ها و سایر وابستگیها
- یک حالت Rollback برای Deployment های خود طراحی کنید.
- yosriady/api-development-tools - مجموعه ای از ابزارهای مفید برای ساخت RESTful HTTP+JSON APIs
مشارکت در این منبع آزاد است و میتوانید این منبع را fork کنید، تغییراتی اعمال کنید و Pull Request ثبت کنید. برای هرگونه سوالی به [email protected] ایمیل ارسال کنید.