FastAPI / دليل حلول تحريري

401 أو 403 أومورد مخفي: تتبع الهوية والسياسة

شخص التحقق الغائب والنطاق الخاطئ وتسرب البديل دون وصول واسع أوالثقة برمز محلل.

وقت القراءة التقريبي: 2 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

قد يعيد المحمي 401 مع ترويسة أو 403 لمستخدم أو 404 بنطاق أوسماحا للجميع بالاختبار. فالشكل غير التحقق والهوية غير الإذن.

افهم الأسباب المحتملة

  • تشمل الأسباب تبعية خاطئة واستخراجا بلا تحقق وادعاء مرفوضا ونطاقا خاطئا وسياسة منسية وبديل باقيا. لا تستبدل CORS وOpenAPI التحقق وصلاحية المورد.

رسم طريق الهوية الموثوقة

سجل المخطط والمستخرج والمحقق والفاعل والتبعيات والتصنيف لا الرمز والكلمة والادعاءات. تحقق من الدالة ووصول الطلب؛ فالتحليل استلام فقط، ويلزم تحقق الخوارزمية والمفتاح والمصدر والجمهور والعمر والجلسة.

python تشخيص هوية وسياسة نطاق معزول كامل
from typing import Annotated
from fastapi import Depends, FastAPI, HTTPException
from fastapi.testclient import TestClient
def principal():
    raise HTTPException(status_code=401, detail="No lab identity", headers={"WWW-Authenticate": "Bearer"})
app = FastAPI()
@app.get("/record")
def record(actor: Annotated[dict, Depends(principal)]):
    value = {"tenant": "red", "text": "public lab data"}
    if actor["tenant"] != value["tenant"]: raise HTTPException(status_code=404, detail="Missing")
    return {"text": value["text"]}
with TestClient(app) as client:
    print(client.get("/record").status_code)
    try:
        app.dependency_overrides[principal] = lambda: {"tenant": "red"}
        print(client.get("/record").status_code)
        app.dependency_overrides[principal] = lambda: {"tenant": "blue"}
        print(client.get("/record").status_code)
    finally:
        app.dependency_overrides.clear()
    print(client.get("/record").status_code)
الناتج المتوقع
401
200
404
401

التسلسل غياب وسماح وإخفاء ثم غياب؛ ويتغير المدخل الاصطناعي فقط وتبقى السياسة.

تفسير عقد الرفض المقصود

يستخدم الغائب أوالباطل 401 ونقص السلطة 403 وقد يخفي النطاق 404 عمدا. ولا توسع بحث 404 لكشف الآخر. قارن الفاعل والعملية والهدف والنطاق والحالة، ولا يكفي الدور أويصير owner_id موثوقا لصحة النوع.

حفظ السياسة الحقيقية وضبط مدخل الاختبار

بدل المحقق أوالمستودع لضبط السيناريو وأبق السياسة. يسمح المثال للمالك ويخفي الآخر ثم يمنع بعد التنظيف. يلغي السماح الدائم ما نحميه؛ فاعزل وأزل في finally حتى الفشل.

python فحص مصفوفة إذن نقي كامل
def allowed(actor, target):
    return bool(actor and actor["tenant"] == target["tenant"] and "read" in actor["permissions"])
target = {"tenant": "red"}
print(allowed({"tenant": "red", "permissions": {"read"}}, target))
print(allowed({"tenant": "blue", "permissions": {"read"}}, target))
print(allowed({"tenant": "red", "permissions": set()}, target))
الناتج المتوقع
True
False
False

يلزم النطاق والإذن معا، ولا تجعل بيانات طلب غير موثق فاعلا موثوقا.

مراجعة طرق التعرض وتغير الحالة

احصر التفصيل والقائمة والتصدير والملف والتعديل والخلفية وتبعياتهما. قرب الشرط من الحفظ عند التغير؛ ولا يجيز الترشيح المورد. راجع مفتاح المخزن والتدقيق فقد يهدمان السياسة، ولا تصلح المنع بمدير أوتعطيل خارج الاختبار.

التحقق من مصفوفة فاعل ومورد كاملة

اختبر الغائب والباطل والمالك والآخر والنطاق والمميز والغائب، وافحص الحالة وغياب المحظور وعودة التبعيات. الأمثلة اصطناعية بلا اعتماد وحساب وقاعدة ومزود أومنفذ. افصل تكامل التشفير والحفظ بإذن.

تحقق من نجاح الإصلاح

يمنع المصحح الغائب والباطل ويسمح للمقصود ويحفظ الإخفاء وغياب المحظور وتنظيف البدائل. افصل دليل التشفير وعزل المعاملة؛ فلا يثبتهما المحلي تلقائيا.

امنع تكرار المشكلة

  • افصل الاستخراج والتحقق والسياق والسياسة بوضوح، وامنع افتراضيا واعزل البدائل ودقق بأمان واختبر كل طريق. راجع التبعيات والمخطط أمنيا لا توثيقا أورمزا يضمن الجميع.

المراجع الرسمية