مهندس نرمافزار هستم و به عنوان 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 ایمیل بزن.
مطلبی دیگر از این انتشارات
معرفی ساده معماری MVC
مطلبی دیگر از این انتشارات
داستان gREST؛ گراف دیتابیس و Restful API
مطلبی دیگر از این انتشارات
چگونه بستر مناسبی برای دورکاری سازمانی ایجاد کنیم؟