繁中版 | 简中版 | 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 ثب کنی. اگر سوالی داشتی به آدرس [email protected]
ایمیل بزن.