पाठ 14 / 27

Object-Level Authorisation और डेटा का उजागर होना

Users को दूसरों के objects पढ़ने या बदलने से रोकें और सिर्फ़ वही fields लौटाएँ जो उन्हें दिखने चाहिए।

ID जाँचना काफ़ी नहीं

सबसे आम गंभीर API दोष broken object-level authorisation (BOLA) है, जो OWASP API Security Top 10 में पहले स्थान पर है: API जाँचता है कि आप logged in हैं, पर यह नहीं कि GET /orders/1042 आपका है, इसलिए संख्या बदलने से किसी और का order पढ़ा जा सकता है। Object ID लेने वाले हर अनुरोध के लिए server पर जाँचें कि caller उस object तक पहुँच सकता है। ज़रूरत से ज़्यादा डेटा उजागर करने से भी बचें: सिर्फ़ वे fields लौटाएँ जो client को चाहिए (आंतरिक flags, password hashes या दूसरे users का व्यक्तिगत डेटा कभी नहीं), database rows उँडेलने की जगह स्पष्ट response models उपयोग करें, और हर input validate करें (type, सीमा, लंबाई, अनुमत मान)। गहराई में बचाव के लिए अनुमान न लगाई जा सकने वाली IDs (UUIDs) चुनें, पर कभी अकेली सुरक्षा के रूप में नहीं।

स्वामित्व की जाँच (उदाहरण)

Query में स्वयं स्वामी शामिल है, इसलिए ग़लत ID दूसरों के objects के लिए बस "नहीं मिला" लौटाती है। 404 (403 की जगह) लौटाना यह पुष्टि करने से भी बचाता है कि object मौजूद है।

@app.get("/v2/orders/{order_id}")
def get_order(order_id: str, user=Depends(current_user)):
    order = db.query_one(
        "SELECT id, total, status FROM orders WHERE id = %s AND owner_id = %s",
        (order_id, user.id),               # ownership is part of the query
    )
    if order is None:
        raise HTTPException(404, "Order not found")
    return order                           # only the fields we chose to expose

दो खातों से परखें

ऐसे tests लिखें जो user A के रूप में login करके user B के objects पढ़ने, बदलने और हटाने की कोशिश करें। हर कोशिश विफल होनी चाहिए। यह एक test API bugs की सबसे महँगी श्रेणी पकड़ता है।

त्वरित जाँच: BOLA का क्या मतलब है और दोष क्या है?

  • एक JSON format
  • Better Online Load Analysis
  • एक caching feature
  • Broken object-level authorisation: ID बदलकर दूसरों के objects तक पहुँचना
Answer

Broken object-level authorisation: ID बदलकर दूसरों के objects तक पहुँचना — Server को हर object का स्वामित्व जाँचना चाहिए, सिर्फ़ यह नहीं कि user logged in है।