Pembatasan & Praktik Terbaik
Pembatasan keamanan dan praktik terbaik untuk menulis kebijakan yang efektif
Untuk alasan keamanan, kebijakan berjalan dalam lingkungan yang dibatasi. Halaman ini mendokumentasikan apa yang tidak diizinkan dan memberikan praktik terbaik untuk menulis kebijakan yang efektif.
Batasan Kebijakan
Kebijakan dibatasi hingga 2.048 karakter panjangnya. Ini mendorong aturan yang ringkas dan terfokus serta memastikan waktu evaluasi yang cepat.
Pembatasan Tingkat Platform
Metode RPC berikut diblokir di tingkat platform dan tidak dapat diaktifkan oleh kebijakan apa pun:
| Category | Methods |
|---|---|
| Debug & Trace | debug_*, trace_* |
| Legacy Filters | eth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter |
Pembatasan ini berlaku untuk semua permintaan terlepas dari organisasi atau kebijakan endpoint.
Batasan eth_getLogs
Metode eth_getLogs dibatasi hanya untuk kueri blok tunggal. Anda harus menentukan salah satu dari:
block_hash: Kueri log dari hash blok tertentublock_number: Kueri log dari nomor blok tertentu (format hex seperti0x100atau tag sepertilatest)
Kueri rentang blok menggunakan fromBlock dan toBlock tidak didukung. Pembatasan ini berlaku untuk permintaan RPC dan MCP.
Kata Kunci yang Diblokir
Pola berikut tidak diizinkan dalam kebijakan:
| Pattern | Reason |
|---|---|
import ... | Cannot import external modules |
package ... | Cannot declare packages |
default ... | Cannot override default values |
data.* | Cannot reference external data |
Kebijakan yang mencoba menggunakan pola ini akan gagal validasi.
Fungsi Bawaan yang Dinonaktifkan
Kategori bawaan ini dinonaktifkan dan akan ditolak:
| 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" |
Kebijakan yang menggunakan fungsi bawaan yang dinonaktifkan akan gagal validasi dengan pesan kesalahan yang jelas yang menunjukkan fungsi mana yang tidak diizinkan.
Kesalahan Validasi
Ketika kebijakan gagal validasi, Anda akan menerima kesalahan seperti:
| 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. |
Ketika kompilasi gagal karena sintaks Rego yang tidak valid, Anda akan menerima nomor baris dan pesan kesalahan dari kompiler.
Praktik Terbaik
Alamat Huruf Kecil
Selalu gunakan lower() untuk pencocokan alamat yang tidak peka huruf besar/kecil:
# Good: Normalized comparison
deny if {
lower(input.to_address) == "0xdead..."
}
# Bad: May miss matches due to case differences
deny if {
input.to_address == "0xDead..."
}Menangani Field Nullable
Beberapa field input dapat bernilai null. Tangani ini dengan baik:
# 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
}Uji Secara Menyeluruh
Sebelum menerapkan kebijakan ke produksi:
- Uji dengan berbagai kombinasi input
- Verifikasi kasus izinkan dan tolak
- Periksa kasus edge (nilai null, array kosong)
- Validasi terhadap data transaksi yang realistis
Dokumentasikan Aturan Anda
Gunakan komentar untuk menjelaskan logika yang kompleks:
# 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
}Gunakan Nama Variabel yang Bermakna
Saat menggunakan variabel lokal, pilih nama yang deskriptif:
# 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
}