繁中版 | 简中版 | Português (Brasil) | Français | 한국어 | Nederlands | Indonesia | ไทย | Русский | Українська | Español | Italiano | 日本語 | Deutsch | Türkçe | Tiếng Việt | Монгол | हिंदी | العربية | Polski | Македонски | ລາວ | Ελληνικά
چکلیستی از مهمترین کارهای لازم برای حفظ امنیت در زمان طراحی، تست و انتشار API.
- از
Basic Authیا هماناصالتسنجی برای دسترسیهای اولیهاستفاده نکن. به جای آن از روشهای استاندارد احراز هویت استفاده کن (مثلا JWT یا OAuth). - برای کارهایی مثل
احراز هویت،تولید توکنوذخیره پسووردچرخ را دوباره اختراع نکن. از استانداردها استفاده کن. - برای لاگین محدودیت
تعداد ماکسیمم تلاش مجددو قفلشدن حساب کاربری را قرار بده. - همهی دادههای حساس را رمزگذاری کن.
- از یک کلید پیچیدهی تصادفی برای
JWT Secretاستفاده کن تا حملهی بروتفورس به توکن بسیار سخت باشد. - الگوریتم را از هدر استخراج نکن. در بکاند الگوریتم را تحمیل کن (
HS256یاRS256). - انقضای توکن (
TTLیاRTTL) را تا حد ممکن کوتاه کن. - اطلاعات حساس را در پیلود JWT ذخیره نکن چون به راحتی قابل رمزگشایی است.
- همیشه
redirect_uriرا در سمت سرور اعتبارسنجی کن تا تنها به URLهای مجاز اجازه داده شود. - همیشه تلاش کن تا code را به جای token تبادل کنی (اجازه
response_type=tokenرا نده). - از پارامتر
stateبا یک هش تصادفی استفاده کن تا از CSRF روی پروسهی احراز حویت OAuth جلوگیری کنی. - مقدار scope پیشفرض را تعریف کن و پارامترهای scope را برای هر اپلیکیشن اعتبارسنجی کن.
- رکوئستها را محدود کن (Throttling) تا از حملات DDos یا بروتفورس جلوگیری شود.
- در سمت سرور از HTTPS استفاده کن تا از حملات مرد میانی جلوگیری شود.
- از هدر
HSTSاستفاده کن تا از حملهی SSL Strip جلوگیری شود.
- از متد HTTP مناسب با توجه به نوع عملیات استفاده کن:
GETبرای خواندن،POSTبرای ایجاد کردن،PUT/PATCHبرای جایگزین یا بروزرسانی وDELETEبرای حذف یک رکورد، و در صورتیکه متد درخواستی برای منبع درخواستشده مناسب نیست با405 Method Not Allowedپاسخ بده. - مقدار
content-typeرا در هدر Accept رکوئست (مذاکره محتوا یا Content Negotiation) اعتبارسنجی کن تا فقط به فرمتهای مورد پشتیبانی اجازه داده شود (مثلاapplication/xml،application/jsonو ...). - مقدار
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 را 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است. - اطلاعات حساس مثل
دادههای اعتبارسنجی،پسووردهاوتوکنهای امنیتیرا برنگردان. - با توجه به عملیات انجامشده، status code مناسب را برگردان. مثلا
200 OK،400 Bad Request،401 Unauthorizedو405 Method Not Allowed.
- طراحی و پیاده سازی خودت را با تستهای unit/integration بازرسی کن.
- از یک پروسهی مرور کد استفاده کن و خود-تاییدی را نادیده بگیر.
- مطمئن شو تا تمامی اجزای سرویسهایت، شامل کتابخانههای استفادهشده و دیگر وابستگیها، قبل از انتشار در حالت production، به طور ایستا توسط نرمافزارهای آنتیویروس اسکن شدهاند.
- برای دپلوی، یک راهحل با قابلیت عقبگرد (rollback) طراحی کن.
- yosriady/api-development-tools - یک مجموعه از منابع بردردبخور برای ساختن APIهای RESTful با HTTP و JSON -
برای همکاری و کمک میتوانی به راحتی این مخزن را fork کنی، تغییرات مورد نظرت را اعمال کنی و یک pull request ثب کنی. اگر سوالی داشتی به آدرس team@shieldfy.io ایمیل بزن.