راهنمای جامع برای ایمنسازی برنامههای FastAPI خود با استفاده از CORS و هدرهای امنیتی ضروری، تضمین محافظت قوی در برابر آسیبپذیریهای رایج وب.
امنیت FastAPI: CORS و هدرهای امنیتی برای APIهای قوی
در چشم انداز دیجیتال به هم پیوسته امروزی، ایمن سازی APIهای شما بسیار مهم است. FastAPI، یک چارچوب وب مدرن و با کارایی بالا برای ساخت APIها با پایتون، ابزارها و ویژگی های عالی را برای پیاده سازی اقدامات امنیتی قوی ارائه می دهد. این راهنمای جامع به دو جنبه مهم امنیت FastAPI می پردازد: اشتراکگذاری منابع متقابل دامنه (CORS) و هدرهای امنیتی. با درک و پیاده سازی این تکنیک ها، می توانید به طور قابل توجهی از API خود در برابر آسیب پذیری های رایج وب محافظت کنید.
درک CORS (اشتراکگذاری منابع متقابل دامنه)
CORS یک مکانیسم امنیتی مرورگر است که صفحات وب را از درخواست به دامنه ای متفاوت از دامنه ای که صفحه وب را ارائه کرده است، محدود می کند. این سیاست برای جلوگیری از دسترسی وب سایت های مخرب به داده های حساس از وب سایت های دیگر بدون مجوز مناسب، اجرا می شود. بدون CORS، یک وب سایت سرکش می تواند به طور بالقوه درخواست های غیرمجاز را به API شما از طرف یک کاربر وارد شده ارسال کند و منجر به نقض داده ها یا سایر سوء استفاده های امنیتی شود.
چرا CORS ضروری است؟
تصور کنید سناریویی را که کاربر وارد حساب بانکی آنلاین خود شده است. به طور همزمان، آنها از یک وب سایت مخرب بازدید می کنند. بدون CORS، وب سایت مخرب می تواند به طور بالقوه کد جاوا اسکریپت را اجرا کند که درخواست هایی را به API بانکی کاربر ارسال می کند و وجوه را به حساب مهاجم منتقل می کند. CORS با اعمال یک سیاست یکسان به طور پیش فرض از این امر جلوگیری می کند.
CORS چگونه کار می کند
هنگامی که یک مرورگر یک درخواست متقاطع (درخواست به مبدا متفاوت از صفحه فعلی) ارسال می کند، ابتدا یک درخواست "preflight" را با استفاده از متد HTTP OPTIONS انجام می دهد. این درخواست پیشپرواز با سرور بررسی میکند تا تعیین کند که آیا درخواست واقعی مجاز است یا خیر. سرور با هدرهایی پاسخ می دهد که نشان می دهد کدام مبداها، روش ها و هدرها مجاز هستند. اگر مرورگر تعیین کند که درخواست بر اساس پاسخ سرور مجاز است، با درخواست واقعی ادامه می یابد. در غیر این صورت، درخواست مسدود می شود.
"مبدا" توسط پروتکل (به عنوان مثال، HTTP یا HTTPS)، دامنه (به عنوان مثال، example.com) و پورت (به عنوان مثال، 80 یا 443) تعریف می شود. دو URL فقط در صورتی از یک مبدا در نظر گرفته می شوند که هر سه این مؤلفه ها دقیقاً مطابقت داشته باشند.
پیکربندی CORS در FastAPI
FastAPI فرآیند پیکربندی CORS را با استفاده از CORSMiddleware ساده می کند. می توانید این میانافزار را به برنامه FastAPI خود اضافه کنید تا CORS را فعال کرده و مبداها، روش ها و هدرهای مجاز را مشخص کنید.
در اینجا یک مثال اساسی از نحوه فعال کردن CORS در FastAPI آورده شده است:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost",
"http://localhost:8080",
"https://example.com",
"https://*.example.com", # Allow all subdomains of example.com
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
در این مثال:
allow_origins: لیستی از مبداهایی را مشخص می کند که مجاز به درخواست های متقاطع هستند. استفاده از["*"]به همه مبداها اجازه می دهد، که به طور کلی برای محیط های تولید توصیه نمی شود. در عوض، مبداهای دقیقی را که باید مجاز باشند، مشخص کنید.allow_credentials: نشان می دهد که آیا اجازه داده شود اعتبارنامه ها (به عنوان مثال، کوکی ها، هدرهای مجوز) در درخواست های متقاطع گنجانده شوند یا خیر. تنظیم این رویTrueمستلزم این است که هدرAccess-Control-Allow-Originروی یک مبدا خاص تنظیم شود، نه*.allow_methods: لیستی از روش های HTTP را مشخص می کند که برای درخواست های متقاطع مجاز هستند. استفاده از["*"]به همه روش ها اجازه می دهد. می توانید این را به روش های خاصی مانند["GET", "POST", "PUT", "DELETE"]برای امنیت بیشتر محدود کنید.allow_headers: لیستی از هدرهای HTTP را مشخص می کند که در درخواست های متقاطع مجاز هستند. استفاده از["*"]به همه هدرها اجازه می دهد. در نظر بگیرید که این را فقط به هدرهای ضروری برای امنیت بیشتر محدود کنید.
بهترین روش ها برای پیکربندی CORS
- از استفاده از
["*"]برایallow_originsدر تولید خودداری کنید: این API شما را برای درخواست ها از هر مبدایی باز می کند، که می تواند یک خطر امنیتی باشد. در عوض، به طور صریح مبداهای مجاز را فهرست کنید. - با روش ها و هدرهای مجاز خاص باشید: فقط روش ها و هدرهایی را که واقعاً توسط برنامه شما مورد نیاز هستند، مجاز کنید.
- پیامدهای
allow_credentialsرا درک کنید: اگر به اعتبارنامه ها اجازه می دهید، مطمئن شوید که پیامدهای امنیتی را درک می کنید و سرور خود را بر این اساس پیکربندی کنید. - پیکربندی CORS خود را به طور مرتب بررسی کنید: با تکامل برنامه شما، ممکن است پیکربندی CORS شما نیاز به به روز رسانی داشته باشد تا تغییرات در مبداها، روش ها یا هدرهای مجاز شما را منعکس کند.
پیاده سازی هدرهای امنیتی
هدرهای امنیتی، هدرهای پاسخ HTTP هستند که دستورالعمل هایی را به مرورگر در مورد نحوه رفتار هنگام رسیدگی به وب سایت یا API شما ارائه می دهند. آنها به کاهش آسیب پذیری های مختلف وب، مانند اسکریپت نویسی متقابل سایت (XSS)، کلیک جکینگ و سایر حملات کمک می کنند. تنظیم صحیح این هدرها برای محافظت از برنامه FastAPI شما بسیار مهم است.
هدرهای امنیتی رایج و اهمیت آنها
Content-Security-Policy (CSP): این هدر ابزاری قدرتمند برای جلوگیری از حملات XSS است. این امکان را به شما می دهد تا یک لیست سفید از منابع تعریف کنید که مرورگر مجاز به بارگیری منابعی مانند اسکریپت ها، شیوه نامه ها و تصاویر از آنها باشد.X-Frame-Options: این هدر با جلوگیری از جاسازی وب سایت شما در یک فریم در وب سایت دیگر، از حملات کلیک جکینگ محافظت می کند.Strict-Transport-Security (HSTS): این هدر مرورگر را مجبور می کند همیشه هنگام دسترسی به وب سایت شما از HTTPS استفاده کند و از حملات مرد میانی جلوگیری می کند.X-Content-Type-Options: این هدر از تفسیر فایل ها توسط مرورگر به عنوان نوع MIME متفاوت از آنچه در هدرContent-Typeاعلام شده است، جلوگیری می کند و آسیب پذیری های استشمام MIME را کاهش می دهد.Referrer-Policy: این هدر میزان اطلاعات ارجاع دهنده (URL صفحه قبلی) را که با درخواست ها ارسال می شود، کنترل می کند.Permissions-Policy(قبلاً Feature-Policy): این هدر به شما امکان می دهد کنترل کنید کدام ویژگی های مرورگر (به عنوان مثال، دوربین، میکروفون، موقعیت جغرافیایی) مجاز به استفاده در وب سایت شما هستند.
تنظیم هدرهای امنیتی در FastAPI
در حالی که FastAPI به طور خاص میان افزاری داخلی برای تنظیم هدرهای امنیتی ندارد، می توانید به راحتی با استفاده از میان افزار سفارشی یا یک کتابخانه شخص ثالث مانند starlette-security یا با تنظیم مستقیم هدرها در پاسخ های خود به این هدف دست یابید.
مثال با استفاده از میان افزار سفارشی:
from fastapi import FastAPI, Request, Response
from starlette.middleware import Middleware
from starlette.responses import JSONResponse
app = FastAPI()
async def add_security_headers(request: Request, call_next):
response: Response = await call_next(request)
response.headers["Content-Security-Policy"] = "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; object-src 'none'; media-src 'self'; frame-ancestors 'none'; upgrade-insecure-requests; block-all-mixed-content;"
response.headers["X-Frame-Options"] = "DENY"
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["Referrer-Policy"] = "strict-origin-when-cross-origin"
response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains; preload"
response.headers["Permissions-Policy"] = "geolocation=(), camera=(), microphone=()"
return response
app.middleware("http")(add_security_headers)
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
در این مثال، میان افزار add_security_headers به برنامه FastAPI اضافه شده است. این میان افزار هر درخواست را رهگیری می کند و هدرهای امنیتی مشخص شده را به پاسخ اضافه می کند. بیایید هدرها را تجزیه کنیم:
Content-Security-Policy: این یک هدر پیچیده است که منابع مجاز را برای انواع مختلف منابع تعریف می کند. در این مثال، به منابعی از مبدا مشابه ('self')، اسکریپت ها و سبک های درون خطی ('unsafe-inline'- با احتیاط استفاده کنید)، URI های داده برای تصاویر (data:) اجازه می دهد و عناصر شی را غیرفعال می کند (object-src 'none'). همچنینframe-ancestors 'none'را برای جلوگیری از کلیک جکینگ تنظیم می کند.upgrade-insecure-requestsبه مرورگر می گوید که همه URL های ناامن (HTTP) را به HTTPS ارتقا دهد.block-all-mixed-contentاز بارگیری هرگونه محتوای ترکیبی (محتوای HTTP در یک صفحه HTTPS) توسط مرورگر جلوگیری می کند. بسیار مهم است که این هدر را مطابق با نیازهای خاص برنامه خود سفارشی کنید. پیکربندی های نادرست CSP می تواند وب سایت شما را خراب کند.X-Frame-Options: رویDENYتنظیم شده است تا از قرار گرفتن صفحه در فریم توسط هر دامنه ای جلوگیری شود. از طرف دیگر،SAMEORIGINفقط اجازه می دهد توسط همان دامنه فریم شود.X-Content-Type-Options: رویnosniffتنظیم شده است تا از استشمام MIME جلوگیری شود.Referrer-Policy: رویstrict-origin-when-cross-originتنظیم شده است تا مبدا (پروتکل + میزبان) را به عنوان ارجاع دهنده هنگام پیمایش به مبدا دیگر ارسال کند و هیچ ارجاع دهنده ای هنگام پیمایش به همان مبدا ارسال نکند.Strict-Transport-Security: سیاستی را تنظیم می کند که مرورگر را مجبور می کند برای مدت معینی (max-age) از HTTPS استفاده کند.includeSubDomainsتضمین می کند که همه زیر دامنه ها نیز توسط HTTPS محافظت می شوند.preloadبه دامنه اجازه می دهد تا در لیست پیش بارگذاری HSTS گنجانده شود که در مرورگرها تعبیه شده است. توجه داشته باشید که استفاده ازpreloadمستلزم این است که سایت شما به لیست پیش بارگذاری HSTS ارسال شده و توسط آن پذیرفته شده باشد.Permissions-Policy: مشخص می کند که کدام ویژگی ها (به عنوان مثال، موقعیت جغرافیایی، دوربین، میکروفون) مجاز به استفاده در مرورگر هستند. در این مثال، همه غیرمجاز هستند.
ملاحظات کلیدی برای هدرهای امنیتی:
Content-Security-Policyرا با دقت سفارشی کنید: این پیچیده ترین هدر امنیتی است و پیکربندی صحیح آن برای جلوگیری از خراب شدن وب سایت شما بسیار مهم است. از یک تولید کننده یا اعتبارسنج CSP برای کمک به ایجاد یک سیاست ایمن و موثر استفاده کنید.- هدرهای امنیتی خود را آزمایش کنید: از ابزارهای آنلاین مانند SecurityHeaders.com برای آزمایش هدرهای امنیتی وب سایت خود و شناسایی هرگونه مشکل احتمالی استفاده کنید.
- هدرهای امنیتی خود را نظارت کنید: به طور مرتب هدرهای امنیتی خود را نظارت کنید تا مطمئن شوید که هنوز موثر هستند و هیچ تغییری لازم نیست.
- استفاده از یک شبکه تحویل محتوا (CDN) را در نظر بگیرید: بسیاری از CDN ها ویژگی های مدیریت هدر امنیتی داخلی را ارائه می دهند که می تواند فرآیند تنظیم و نگهداری هدرهای امنیتی شما را ساده کند.
فراتر از CORS و هدرهای امنیتی
در حالی که CORS و هدرهای امنیتی برای امنیت API ضروری هستند، اما تنها اقداماتی نیستند که باید انجام دهید. سایر ملاحظات امنیتی مهم عبارتند از:
- احراز هویت و مجوز: مکانیسم های احراز هویت و مجوز قوی را پیاده سازی کنید تا اطمینان حاصل کنید که فقط کاربران مجاز می توانند به API شما دسترسی داشته باشند. استفاده از OAuth 2.0 یا JWT (توکن های وب JSON) را برای احراز هویت در نظر بگیرید.
- اعتبارسنجی ورودی: تمام ورودی های کاربر را برای جلوگیری از حملات تزریقی (به عنوان مثال، تزریق SQL، XSS) اعتبارسنجی کنید.
- محدودیت نرخ: محدودیت نرخ را برای جلوگیری از حملات انکار سرویس (DoS) پیاده سازی کنید.
- ثبت و نظارت: تمام درخواست های API را ثبت کنید و API خود را برای فعالیت های مشکوک نظارت کنید.
- ممیزی های امنیتی منظم: ممیزی های امنیتی منظم را برای شناسایی و رسیدگی به هرگونه آسیب پذیری احتمالی انجام دهید.
- وابستگی ها را به روز نگه دارید: به طور مرتب نسخه FastAPI خود و تمام وابستگی های آن را برای وصله کردن آسیب پذیری های امنیتی به روز کنید.
نتیجه گیری
ایمن سازی APIهای FastAPI شما نیازمند یک رویکرد چند وجهی است. با اجرای صحیح CORS و تنظیم هدرهای امنیتی مناسب، می توانید خطر آسیب پذیری های مختلف وب را به طور قابل توجهی کاهش دهید. به یاد داشته باشید که به طور مرتب پیکربندی امنیتی خود را بررسی و به روز کنید تا با تهدیدهای در حال تکامل همگام شوید. اتخاذ یک استراتژی امنیتی جامع، از جمله احراز هویت، اعتبارسنجی ورودی، محدودیت نرخ و نظارت، برای ایجاد APIهای قوی و ایمن که از کاربران و داده های شما محافظت می کنند، بسیار مهم است. اجرای این اقدامات، در حالی که به طور بالقوه پیچیده است، یک سرمایه گذاری ضروری برای اطمینان از امنیت و ثبات بلندمدت برنامه های شما در چشم انداز تهدید امروزی است.