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:

CategoryMethods
Debug & Tracedebug_*, trace_*
Legacy Filterseth_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 tertentu
  • block_number: Kueri log dari nomor blok tertentu (format hex seperti 0x100 atau tag seperti latest)

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:

PatternReason
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:

PatternError 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:

ErrorCause
"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:

  1. Uji dengan berbagai kombinasi input
  2. Verifikasi kasus izinkan dan tolak
  3. Periksa kasus edge (nilai null, array kosong)
  4. 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
}
Pembatasan & Praktik Terbaik | 256 Blocks