دليل شامل لتأمين تطبيقات FastAPI الخاصة بك باستخدام CORS وعناوين الأمان الأساسية، مما يضمن حماية قوية ضد نقاط الضعف الشائعة على الويب.
تأمين FastAPI: CORS وعناوين الأمان APIs قوية
في المشهد الرقمي المترابط اليوم، يعد تأمين واجهات برمجة التطبيقات (APIs) الخاصة بك أمرًا بالغ الأهمية. يوفر FastAPI، وهو إطار عمل ويب حديث وعالي الأداء لإنشاء واجهات برمجة التطبيقات باستخدام بايثون، أدوات وميزات ممتازة لتنفيذ تدابير أمنية قوية. يتعمق هذا الدليل الشامل في جانبين حاسمين من أمان FastAPI: مشاركة الموارد عبر المنشأ (CORS) وعناوين الأمان. من خلال فهم وتنفيذ هذه التقنيات، يمكنك تحسين حماية واجهة برمجة التطبيقات (API) الخاصة بك بشكل كبير ضد نقاط الضعف الشائعة على الويب.
فهم CORS (مشاركة الموارد عبر المنشأ)
CORS هي آلية أمان للمتصفح تقيد صفحات الويب من إرسال طلبات إلى نطاق مختلف عن النطاق الذي قدم صفحة الويب. هذه السياسة مطبقة لمنع مواقع الويب الضارة من الوصول إلى بيانات حساسة من مواقع ويب أخرى دون ترخيص مناسب. بدون CORS، يمكن لموقع ويب مارق أن يرسل طلبات غير مصرح بها إلى واجهة برمجة التطبيقات (API) الخاصة بك نيابة عن مستخدم قام بتسجيل الدخول، مما يؤدي إلى خروقات البيانات أو استغلالات أمنية أخرى.
لماذا CORS ضروري؟
تخيل سيناريو حيث يتم تسجيل دخول مستخدم إلى حسابه المصرفي عبر الإنترنت. في الوقت نفسه، يزورون موقعًا ضارًا. بدون CORS، يمكن لموقع الويب الضار تنفيذ كود JavaScript يرسل طلبات إلى واجهة برمجة التطبيقات المصرفية الخاصة بالمستخدم، وتحويل الأموال إلى حساب المهاجم. يمنع CORS هذا عن طريق فرض سياسة نفس الأصل بشكل افتراضي.
كيف يعمل CORS
عندما يرسل متصفح طلبًا عبر المنشأ (طلبًا إلى أصل مختلف عن الصفحة الحالية)، فإنه يقوم أولاً بطلب "تحقق مسبق" باستخدام طريقة 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: يعين سياسة تجبر المتصفح على استخدام HTTPS لمدة محددة (max-age). تضمن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 وجميع تبعياته بانتظام لتصحيح الثغرات الأمنية.
الخلاصة
يتطلب تأمين واجهات برمجة التطبيقات (APIs) الخاصة بك في FastAPI اتباع نهج متعدد الأوجه. من خلال تنفيذ CORS بشكل صحيح وتعيين رؤوس أمان مناسبة، يمكنك تقليل مخاطر نقاط الضعف المختلفة على الويب بشكل كبير. تذكر مراجعة وتحديث التكوين الأمني الخاص بك بانتظام لمواكبة التهديدات المتطورة. يعد تبني استراتيجية أمنية شاملة، بما في ذلك المصادقة والتحقق من صحة الإدخال وتحديد المعدل والمراقبة، أمرًا بالغ الأهمية لبناء واجهات برمجة تطبيقات (APIs) قوية وآمنة تحمي المستخدمين والبيانات الخاصة بك. يعد تنفيذ هذه التدابير، على الرغم من أنه قد يكون معقدًا، استثمارًا ضروريًا لضمان الأمن والاستقرار على المدى الطويل لتطبيقاتك في المشهد الحالي للتهديدات.