AI ऐप्लिकेशन्स को सुरक्षित करनामध्यमपाठ 1378 मिनट का पाठ

मॉडल के आउटपुट को untrusted इनपुट की तरह समझें

मॉडल का आउटपुट आंशिक रूप से उसी व्यक्ति द्वारा लिखा होता है जिसने वह टेक्स्ट लिखा था जिसे मॉडल ने पढ़ा। कोई भी दूसरा कोड इसका इस्तेमाल करे, उससे पहले इसे escape करें, validate करें और allow-list करें।

पाठ वीडियो में

60 सेकंड में

मॉडल के आउटपुट को untrusted इनपुट की तरह समझें

मॉडल का आउटपुट आंशिक रूप से उसी व्यक्ति द्वारा लिखा होता है जिसने वह टेक्स्ट लिखा था जिसे मॉडल ने पढ़ा। कोई भी दूसरा कोड इसका इस्तेमाल करे, उससे पहले इसे escape करें, validate…

1/6
आसान शब्दों में
अगर कोई अजनबी आपको कोई पर्ची थमाता है, तो आप पहले उसे पढ़ते हैं। आप बिना देखे उसे बैंक कैशियर को नहीं थमा देते। AI का जवाब भी एक ऐसी पर्ची है जिसे लिखने में शायद अजनबियों का हाथ रहा हो।
मॉडल का आउटपुट यूज़र के मैसेज और उसके द्वारा पढ़े गए हर डॉक्यूमेंट, वेब पेज या टूल के नतीजे से तय होता है। इनमें से किसी में भी किसी हमलावर (attacker) का टेक्स्ट हो सकता है। इसलिए आउटपुट को user input की तरह ही माना जाना चाहिए: इससे पहले कि आपका कोड इसे render करे, run करे, store करे या fetch करे, इसे validate, encode और सीमित किया जाना चाहिए। OWASP यहाँ होने वाली चूक को LLM05 Improper Output Handling कहता है।

आउटपुट कहाँ जाता है, और क्या गलत हो सकता है

आउटपुट कहाँ जाता हैक्या गलत हो सकता हैकंट्रोल
वेब पेज में HTML या markdown के रूप में दिखाया जानाCross-site scripting (XSS): यूज़र के ब्राउज़र में कोई स्क्रिप्ट चल जाती हैHTML को escape करें; ऐसा markdown renderer इस्तेमाल करें जिसमें raw HTML बंद हो; Content Security Policy जोड़ें
Markdown इमेज जो अपने-आप लोड हो जाती हैंबिना किसी क्लिक के, डेटा इमेज के URL के ज़रिए बाहर चला जाता है (देखें How data actually escapes)इमेज को render न करें, या केवल अपने खुद के इमेज होस्ट्स को अनुमति दें; Content Security Policy में img-src को सीमित करें
लिंक्सफ़िशिंग (Phishing), या लिंक के query string में छिपे सीक्रेट्सडोमेन को allow-list करें; पूरा पता दिखाएं; बाकी लिंक्स हटा दें
SQL में डाला जानाSQL injection, या ऐसी टेबलें पढ़ना जो यूज़र को नहीं देखनी चाहिएअसली डेटा पर मॉडल का लिखा SQL न चलाएं; पैरामीटर्स और allow-list किए गए कॉलम का इस्तेमाल करें; read-only रोल का उपयोग करें
शैल (shell) या eval में भेजा जानाCommand injection: हमलावर आपके सर्वर पर कोड चला देता हैकभी नहीं। वैलिडेटेड (validated) आर्गुमेंट्स के साथ तय फ़ंक्शन्स का इस्तेमाल करें
वे URL जिन्हें आपका सर्वर फ़ेच (fetch) करता हैServer-side request forgery (SSRF): इंटरनल सर्विसेज तक पहुँच जानाहोस्ट्स को allow-list करें; प्राइवेट और link-local एड्रेस को ब्लॉक करें; आँख मूंदकर रीडायरेक्ट्स (redirects) को फ़ॉलो न करें
टूल कॉल के लिए JSONगलत टाइप्स, फालतू फ़ील्ड्स, बहुत बड़ी वैल्यूज़JSON schema से validate करें; अनजान फ़ील्ड्स को रिजेक्ट करें; फिर बिज़नेस रूल्स चेक करें

Render करने से पहले escape करें

Python: escape text and allow-list linkspython
import html
from urllib.parse import urlparse

ALLOWED_LINK_HOSTS = {"help.example.com", "docs.example.com"}

def safe_text(model_output: str) -> str:
    # The browser will show this as text. It will never run it.
    return html.escape(model_output)

def safe_link(url: str) -> str | None:
    parsed = urlparse(url)
    if parsed.scheme != "https":
        return None
    if parsed.hostname not in ALLOWED_LINK_HOSTS:
        return None
    return url
ज़्यादातर चैट इंटरफ़ेस markdown को render करते हैं। ऐसा renderer इस्तेमाल करें जो डिफ़ॉल्ट रूप से raw HTML को escape करता हो, और इमेज व लिंक्स के लिए उसकी सेटिंग्स चेक करें। React जैसे फ़्रेमवर्क सामान्य इस्तेमाल में टेक्स्ट को escape करते हैं; ख़तरा तब शुरू होता है जब कोड जानबूझकर raw HTML डालता है।

स्ट्रक्चर्ड आउटपुट को validate करें

जब मॉडल किसी टूल कॉल का सुझाव देता है, तो उसके arguments बस JSON के रूप में लिखा गया टेक्स्ट होते हैं। schema की मदद से उसकी बनावट (shape) जांचें, फिर कोड में उसका अर्थ (meaning) जांचें।
Python: JSON schema for a refund tool (jsonschema library)python
from jsonschema import validate, ValidationError

REFUND_SCHEMA = {
    "type": "object",
    "properties": {
        "order_id": {"type": "string", "pattern": "^ORD-[0-9]{6}$"},
        "amount":   {"type": "number", "minimum": 1, "maximum": 500},
        "reason":   {"type": "string", "maxLength": 200},
    },
    "required": ["order_id", "amount"],
    "additionalProperties": False,
}

def check_refund_args(args: dict) -> dict:
    try:
        validate(instance=args, schema=REFUND_SCHEMA)
    except ValidationError as e:
        raise ValueError(f"rejected tool call: {e.message}")
    # The schema checks shape. Ownership is checked next, in code:
    # does this order belong to the logged-in user?
    return args
आउटपुट पर भरोसा करना
  • जवाब को raw HTML के रूप में पेज में डालना
  • लाइव डेटाबेस पर मॉडल का लिखा हुआ SQL चलाना
  • मॉडल द्वारा दिए गए किसी भी URL को fetch करना
  • मॉडल ने जो भी JSON दिया, उसी के साथ टूल को कॉल कर देना
आउटपुट को इनपुट की तरह समझना
  • टेक्स्ट को escape करना और सुरक्षित markdown renderer का इस्तेमाल करना
  • मॉडल को allow-list की गई क्वेरीज़ और कॉलम में से चुनने देना
  • केवल allow-list किए गए होस्ट्स को fetch करना, इंटरनल एड्रेस को कभी नहीं
  • Schema चेक, फिर टूल में ओनरशिप और लिमिट्स की जांच
ख़तरा
मॉडल के आउटपुट को कभी भी eval, exec, शैल (shell), या कोड चलाने वाले किसी टेम्पलेट इंजन में न भेजें। अगर फ़ीचर को सच में जनरेट किया गया कोड चलाने की ज़रूरत है, तो उसे बिना किसी सीक्रेट्स और बिना नेटवर्क वाले sandbox में चलाएं, जैसा कि agent-security ट्रैक में बताया गया है।
यह करें
ये कंट्रोल्स सामान्य एप्लिकेशन सिक्योरिटी का हिस्सा हैं। ये तब भी काम करते रहते हैं जब मॉडल prompt injection से पूरी तरह बेवकूफ़ बन चुका हो। यही वजह है कि इनकी कीमत प्रॉम्प्ट में लिखी किसी भी लाइन से कहीं ज़्यादा है।
इसे आज़माएं। अपने ऐप में ऐसी कोई एक जगह देखें जहाँ मॉडल के आउटपुट का इस्तेमाल होता है। क्या इसे render किया जाता है, run किया जाता है, store किया जाता है, fetch किया जाता है या किसी टूल को भेजा जाता है? ऊपर दी गई टेबल की कौन सी पंक्ति (row) इस पर लागू होती है?

और देखें और पढ़ें

लैब

एक छोटा Python फ़ंक्शन जो मॉडल के आउटपुट को सुरक्षित HTML में बदलता है, और जिसके सभी टेस्ट पास होते हैं।

~30 min

समस्या

अपने कंप्यूटर पर, स्टार्टर कोड में मौजूद render_reply फ़ंक्शन को पूरा करें। इसे यह करना होगा:

  1. markdown इमेज को पूरी तरह हटाना।
  2. टेक्स्ट के सभी HTML को escape करना।
  3. [label](url) को असली लिंक में केवल तभी बदलना जब URL में https का इस्तेमाल हो और उसका होस्ट allow-list में हो। वरना केवल लेबल को सामान्य टेक्स्ट के रूप में रखना।

फ़ाइल चलाएं। चारों टेस्ट पास होने चाहिए। फिर अपने खुद के दो टेस्ट जोड़ें, उदाहरण के लिए https की जगह http:// वाला लिंक, या help.example.com.evil.example का लिंक।

प्रैक्टिस लैब

कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।

आउटपुट

कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।

आपका काम तब पूरा होगा जब

कठिन सवाल

उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।

Q1<code>"help.example.com" in url</code> चेक करना एक कमज़ोर allow-list क्यों है?दिखाएं

सबस्ट्रिंग चेक https://help.example.com.evil.example/ या https://evil.example/?x=help.example.com जैसे पतों को भी स्वीकार कर लेता है। URL को parse करें, सटीक होस्ट नेम निकालें, और उसकी तुलना allow-list से करें। साथ ही स्कीम (scheme) भी चेक करें, ताकि गैर-https लिंक्स को हटाया जा सके।

Q2आपका फ़ंक्शन HTML को escape करता है और लिंक्स को फ़िल्टर करता है। कोई एक और तरीका बताएं जिससे मॉडल का आउटपुट किसी यूज़र को नुकसान पहुँचा सकता है, और इसे कैसे कम किया जाए।दिखाएं

टेक्स्ट खुद भी गुमराह कर सकता है: कोई फ़र्ज़ी फ़ोन नंबर, फ़र्ज़ी UPI ID या गलत निर्देश जैसे "अपना OTP हमारे एजेंट के साथ शेयर करें"। Escaping इसे नहीं पकड़ सकती। इसे कम करने के तरीके हैं: स्कोप सीमित करना, जवाबों में पेमेंट ID और फ़ोन नंबर की पहचान करना, इंटरफ़ेस में साफ़ चेतावनियाँ देना, और बॉट को कभी भी सीक्रेट्स न मांगने देना। यही वह जगह है जहाँ आउटपुट हैंडलिंग का सामना गलत जानकारी (misinformation) से होता है।

जारी रखने के लिए कृपया साइन इन करें।

अक्सर पूछे जाने वाले सवाल

अगर मॉडल किसी भरोसेमंद प्रोवाइडर का है, तो क्या उसका आउटपुट भरोसेमंद होता है?

नहीं। प्रोवाइडर पर मॉडल चलाने का भरोसा तो होता है, लेकिन आउटपुट ऐसे इनपुट्स पर निर्भर करता है जो आपके कंट्रोल में नहीं हैं: यूज़र के मैसेज, डॉक्यूमेंट्स, वेब पेज और टूल के नतीजे। इनमें से कोई भी आउटपुट की दिशा बदल सकता है।

क्या markdown को render करना सुरक्षित है?

यह renderer और उसकी सेटिंग्स पर निर्भर करता है। कुछ renderer बिना रोके raw HTML को जाने देते हैं, और ज़्यादातर इमेज सिंटेक्स को ऐसी इमेज में बदल देते हैं जो अपने-आप लोड हो जाती हैं। raw HTML को बंद करें, इमेज और लिंक्स के लिए एक पॉलिसी तय करें, और नुकसानदेह (hostile) उदाहरणों के साथ इसका टेस्ट करें।

क्या मैं किसी रिपोर्टिंग फ़ीचर के लिए मॉडल से SQL लिखवा सकता हूँ?

सावधान रहें। ज़्यादा सुरक्षित तरीके: मॉडल पैरामीटर्स वाली पहले से तय और जाँची-परखी क्वेरीज़ में से चुने; या फिर जनरेट किया गया SQL केवल एक read-only कॉपी पर चले, जिसमें रोल सिर्फ़ उन्हीं टेबल तक सीमित हो जिन्हें वह यूज़र देख सकता है, साथ ही रो (row) की सीमा और टाइमआउट भी तय हों। इसे प्रोडक्शन डेटा पर किसी पावरफुल अकाउंट के साथ कभी न चलाएं।

क्या Content Security Policy से XSS ठीक हो जाता है?

यह सुरक्षा की एक मजबूत दूसरी परत है। यह इनलाइन स्क्रिप्ट्स को ब्लॉक कर सकती है और यह सीमित कर सकती है कि इमेज और स्क्रिप्ट कहाँ से लोड होंगी। यह escaping की जगह नहीं ले सकती, और कमज़ोर पॉलिसी से बहुत कम सुरक्षा मिलती है। दोनों का इस्तेमाल करें।

पाठ का टेस्ट

5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।

टेस्ट देने और अपनी प्रोग्रेस सेव करने के लिए साइन इन करें