مهندس نرمافزار هستم و به عنوان Senior Software Engineer مشغول به کارم. به جاوااسکریپت، پایتون، دیتابیسها و طراحی و معماری نرمافزار علاقه زیادی دارم. وبلاگهام: yavarjs.ir و hamidreza.tech
چکلیست امنیتی API

داستان ترجمه
به طور خیلی اتفاقی به یه مخزن Github رسیدم که استار خیلی زیادی داشت و داخلش چکلیستی از موارد امنیتی مهمی رو که باید در حین طراحی، پیادهسازی و دپلوی APIها رعایت کرد، قرار داده بود.
چون کوتاه بود و با خوندنش حس کردم خیلی مفیده، تصمیم گرفتم ترجمش کنم. بعد از این که ترجمه کردم و چند بار مرور و ویرایش کردم، مشکل راستبهچپ کردن فایل مارکداون رو حل کردم و بعد دیدم که متاسفانه وقتی با ترفندی که توی استک اورفلو پیدا کرده بودم، فایل مارکداون رو راستبهچپ میکنم، checkboxها میافته روی متن! واقعا از دست Github عصبانی بودم و در نهایت با کلی آزمون و خطا و با کمک ;nbsp& مشکل رو حل کردم :)
توی pull requestهای مخزن دیدم که دوتا پولرکوئست فعال برای ترجمهی فارسی وجود داره! یکی از پولرکوئستها که جدیدتر هم بود ترجمهی خوبی نداشت و مترجم، فایل مارکداونش رو راستبهچپ نکرده بود! پولرکوئست دومی ترجمهی خوبی داشت (و از بخشهایی از ترجمش برای بهتر کردن ترجمهی خودم هم استفاده کردم) و فایل مارکداونش هم راستبهچپ بود ولی مشکل روهمافتادن checkboxها رو حل نکرده بود. پس خودم یه پولرکوئست جدید درست کردم و موارد بالارو داخلش توضیح دادم.
لینک مخزن گیتهاب چکلیست. نگاه کنید و اگه خوشتون اومد استار کنید.
در ادامهی نوشته ترجمهی خود چکلیست رو هم قرار میدم چون ویرگول نوشته رو حذف کرد به دلیل تبلیغات و لینکسازی! اما توجه داشته باشید که چکلیست در واقع یه چیز پویاست که میتونه تغییر کنه و موارد مختلفی به اون اضافه یا کم بشه و اگه واقعا میخواین نسخهی بروزش رو ببینید باید از گیتهاب اینکارو بکنید.
چکلیست امنیتی API
چکلیستی از مهمترین کارهای لازم برای حفظ امنیت در زمان طراحی، تست و انتشار API.
احراز هویت
- از
Basic Authیا هماناصالتسنجی برای دسترسیهای اولیهاستفاده نکن. به جای آن از روشهای استاندارد احراز هویت استفاده کن (مثلا JWT یا OAuth). - برای کارهایی مثل
احراز هویت،تولید توکنوذخیره پسووردچرخ را دوباره اختراع نکن. از استانداردها استفاده کن. - برای لاگین محدودیتهای
تعداد ماکسیمم تلاش مجددو تعداد دفعات ورود را قرار بده. - همهی دادههای حساس را رمزگذاری کن.
JWT (JSON Web Token)
- از یک کلید پیچیدهی تصادفی برای
JWT Secretاستفاده کن تا حملهی بروتفورس به توکن بسیار سخت باشد. - الگوریتم را از هدر استخراج نکن. در بکاند الگوریتم را تحمیل کن (
HS256یاRS256). - انقضای توکن (
TTLیاRTTL) را تا حد ممکن کوتاه کن. - اطلاعات حساس را در پیلود JWT ذخیره نکن چون به راحتی قابل رمزگشایی است.
OAuth
- همیشه
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.
CI & CD
- طراحی و پیاده سازی خودت را با پوشش تستهای unit/integration بازرسی کن.
- از یک پروسهی مرور کد استفاده کن و خود-تاییدی را نادیده بگیر.
- مطمئن شو تا تمامی اجزای سرویسهایت، شامل کتابخانههای استفادهشده و دیگر وابستگیها، قبل از انتشار در حالت production، به طور ایستا توسط نرمافزارهای آنتیویروس اسکن شدهاند.
- برای دپلوی، یک راهحل با قابلیت عقبگرد (rollback) طراحی کن.
نگاهی بیانداز به:
- yosriady/api-development-tools - یک مجموعه از منابع بردردبخور برای ساختن APIهای RESTful با HTTP و JSON -
مشارکت
برای همکاری و کمک میتوانی به راحتی این مخزن را fork کنی، تغییرات مورد نظرت را اعمال کنی و یک pull request ثب کنی. اگر سوالی داشتی به آدرس team@shieldfy.io ایمیل بزن.
مطلبی دیگر از این انتشارات
درنیامدی بر RESTful API
مطلبی دیگر از این انتشارات
نگاهی به زبان برنامه نویسی پایتون
مطلبی دیگر از این انتشارات
معماری اصلاح شده MVC برای وب اپلیکیشن های بزرگ