प्रतिबंध और सर्वोत्तम अभ्यास
प्रभावी नीतियां लिखने के लिए सुरक्षा प्रतिबंध और सर्वोत्तम अभ्यास
सुरक्षा कारणों से, नीतियां एक प्रतिबंधित वातावरण में चलती हैं। यह पृष्ठ उन चीजों का दस्तावेजीकरण करता है जो अनुमत नहीं हैं और प्रभावी नीतियां लिखने के लिए सर्वोत्तम अभ्यास प्रदान करता है।
नीति सीमाएं
नीतियां लंबाई में 2,048 वर्णों तक सीमित हैं। यह संक्षिप्त, केंद्रित नियमों को प्रोत्साहित करता है और तेज मूल्यांकन समय सुनिश्चित करता है।
प्लेटफ़ॉर्म-स्तरीय प्रतिबंध
निम्नलिखित RPC विधियां प्लेटफ़ॉर्म स्तर पर अवरुद्ध हैं और किसी भी नीति द्वारा सक्षम नहीं की जा सकतीं:
| Category | Methods |
|---|---|
| Debug & Trace | debug_*, trace_* |
| Legacy Filters | eth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter |
ये प्रतिबंध संगठन या एंडपॉइंट नीतियों की परवाह किए बिना सभी अनुरोधों पर लागू होते हैं।
eth_getLogs सीमाएं
eth_getLogs विधि केवल एकल ब्लॉक क्वेरी तक सीमित है। आपको निम्नलिखित में से कोई एक निर्दिष्ट करना होगा:
block_hash: किसी विशिष्ट ब्लॉक हैश से लॉग क्वेरी करेंblock_number: किसी विशिष्ट ब्लॉक नंबर से लॉग क्वेरी करें (हेक्स फॉर्मेट जैसे0x100या टैग जैसेlatest)
fromBlock और toBlock का उपयोग करके ब्लॉक रेंज क्वेरी समर्थित नहीं हैं। यह प्रतिबंध RPC और MCP दोनों अनुरोधों पर लागू होता है।
अवरुद्ध कीवर्ड
निम्नलिखित पैटर्न नीतियों में अनुमत नहीं हैं:
| Pattern | Reason |
|---|---|
import ... | Cannot import external modules |
package ... | Cannot declare packages |
default ... | Cannot override default values |
data.* | Cannot reference external data |
इन पैटर्न का उपयोग करने का प्रयास करने वाली नीतियां सत्यापन में विफल हो जाएंगी।
अक्षम अंतर्निहित फ़ंक्शन
ये अंतर्निहित श्रेणियां अक्षम हैं और अस्वीकार की जाएंगी:
| Pattern | Error Message |
|---|---|
http.send | "http.send is disabled" |
crypto.* | "Crypto functions are disabled" |
io.jwt.* | "JWT functions are disabled" |
yaml.* | "YAML functions are disabled" |
uuid.* | "UUID functions are disabled" |
glob.* | "Glob functions are disabled" |
semver.* | "Semver functions are disabled" |
json.schema* | "JSON schema functions are disabled" |
graphql.* | "GraphQL functions are disabled" |
net.cidr* | "Net CIDR functions are disabled" |
opa.runtime* | "OPA runtime functions are disabled" |
rego.metadata* | "Rego metadata functions are disabled" |
अक्षम अंतर्निहित फ़ंक्शन का उपयोग करने वाली नीतियां स्पष्ट त्रुटि संदेश के साथ सत्यापन में विफल हो जाएंगी जो दर्शाता है कि कौन सा फ़ंक्शन अनुमत नहीं है।
सत्यापन त्रुटियां
जब कोई नीति सत्यापन में विफल होती है, तो आपको इस तरह की त्रुटियां प्राप्त होंगी:
| Error | Cause |
|---|---|
| "Import statements are not allowed" | Policy contains import |
| "Package declarations are not allowed" | Policy contains package |
| "Default statements are not allowed" | Policy contains default |
| "Data references are not allowed" | Policy contains data. |
जब अमान्य Rego सिंटैक्स के कारण संकलन विफल होता है, तो आपको कंपाइलर से पंक्ति संख्या और त्रुटि संदेश प्राप्त होगा।
सर्वोत्तम अभ्यास
लोअरकेस पते
केस-असंवेदनशील पता मिलान के लिए हमेशा lower() का उपयोग करें:
# Good: Normalized comparison
deny if {
lower(input.to_address) == "0xdead..."
}
# Bad: May miss matches due to case differences
deny if {
input.to_address == "0xDead..."
}नलेबल फ़ील्ड को संभालें
कुछ इनपुट फ़ील्ड null हो सकते हैं। इसे सावधानीपूर्वक संभालें:
# Good: Check for null before comparison
deny if {
input.usd_value != null
input.usd_value > 10000
}
# Alternative: Use type checking
deny if {
is_number(input.usd_value)
input.usd_value > 10000
}पूर्णतया परीक्षण करें
नीतियों को उत्पादन में तैनात करने से पहले:
- विभिन्न इनपुट संयोजनों के साथ परीक्षण करें
- अनुमति और अस्वीकार के मामलों को सत्यापित करें
- एज केस की जांच करें (null मान, खाली सरणियां)
- वास्तविक लेनदेन डेटा के खिलाफ मान्य करें
अपने नियमों का दस्तावेजीकरण करें
जटिल तर्क को समझाने के लिए टिप्पणियों का उपयोग करें:
# Block high-value transactions during off-hours
# Business hours are 9 AM - 5 PM UTC, Monday-Friday
deny if {
[hour, _, _] := time.clock(time.now_ns())
hour < 9
input.usd_value > 1000
}अर्थपूर्ण चर नामों का उपयोग करें
स्थानीय चर का उपयोग करते समय, वर्णनात्मक नाम चुनें:
# Good: Clear variable names
deny if {
high_risk_threshold := 10000
input.usd_value > high_risk_threshold
}
# Avoid: Cryptic names
deny if {
x := 10000
input.usd_value > x
}