मॉडल के आउटपुट को untrusted इनपुट की तरह समझें
मॉडल का आउटपुट आंशिक रूप से उसी व्यक्ति द्वारा लिखा होता है जिसने वह टेक्स्ट लिखा था जिसे मॉडल ने पढ़ा। कोई भी दूसरा कोड इसका इस्तेमाल करे, उससे पहले इसे escape करें, validate करें और allow-list करें।
60 सेकंड में
मॉडल के आउटपुट को untrusted इनपुट की तरह समझें
मॉडल का आउटपुट आंशिक रूप से उसी व्यक्ति द्वारा लिखा होता है जिसने वह टेक्स्ट लिखा था जिसे मॉडल ने पढ़ा। कोई भी दूसरा कोड इसका इस्तेमाल करे, उससे पहले इसे escape करें, validate…
आउटपुट कहाँ जाता है, और क्या गलत हो सकता है
| आउटपुट कहाँ जाता है | क्या गलत हो सकता है | कंट्रोल |
|---|---|---|
| वेब पेज में 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 करें
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स्ट्रक्चर्ड आउटपुट को validate करें
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 ट्रैक में बताया गया है।और देखें और पढ़ें
लैब
एक छोटा Python फ़ंक्शन जो मॉडल के आउटपुट को सुरक्षित HTML में बदलता है, और जिसके सभी टेस्ट पास होते हैं।
समस्या
अपने कंप्यूटर पर, स्टार्टर कोड में मौजूद render_reply फ़ंक्शन को पूरा करें। इसे यह करना होगा:
- markdown इमेज को पूरी तरह हटाना।
- टेक्स्ट के सभी HTML को escape करना।
[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%)।