Hạn Chế & Thực Hành Tốt Nhất
Các hạn chế bảo mật và thực hành tốt nhất để viết chính sách hiệu quả
Vì lý do bảo mật, các chính sách chạy trong môi trường bị hạn chế. Trang này ghi lại những gì không được phép và cung cấp các thực hành tốt nhất để viết chính sách hiệu quả.
Giới Hạn Chính Sách
Chính sách bị giới hạn 2.048 ký tự về độ dài. Điều này khuyến khích các quy tắc ngắn gọn, tập trung và đảm bảo thời gian đánh giá nhanh.
Hạn Chế Cấp Nền Tảng
Các phương thức RPC sau bị chặn ở cấp nền tảng và không thể được bật bởi bất kỳ chính sách nào:
| Category | Methods |
|---|---|
| Debug & Trace | debug_*, trace_* |
| Legacy Filters | eth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter |
Những hạn chế này áp dụng cho tất cả các yêu cầu bất kể tổ chức hoặc chính sách điểm cuối.
Hạn Chế eth_getLogs
Phương thức eth_getLogs bị hạn chế chỉ truy vấn một khối. Bạn phải chỉ định một trong:
block_hash: Truy vấn logs từ một hash khối cụ thểblock_number: Truy vấn logs từ một số khối cụ thể (định dạng hex như0x100hoặc các thẻ nhưlatest)
Truy vấn phạm vi khối sử dụng fromBlock và toBlock không được hỗ trợ. Hạn chế này áp dụng cho cả yêu cầu RPC và MCP.
Từ Khóa Bị Chặn
Các mẫu sau không được phép trong chính sách:
| Pattern | Reason |
|---|---|
import ... | Cannot import external modules |
package ... | Cannot declare packages |
default ... | Cannot override default values |
data.* | Cannot reference external data |
Các chính sách cố gắng sử dụng các mẫu này sẽ không vượt qua xác thực.
Hàm Tích Hợp Bị Vô Hiệu Hóa
Các danh mục tích hợp này bị vô hiệu hóa và sẽ bị từ chối:
| 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" |
Các chính sách sử dụng hàm tích hợp bị vô hiệu hóa sẽ không vượt qua xác thực với thông báo lỗi rõ ràng cho biết hàm nào không được phép.
Lỗi Xác Thực
Khi một chính sách không vượt qua xác thực, bạn sẽ nhận được các lỗi như:
| 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. |
Khi biên dịch thất bại do cú pháp Rego không hợp lệ, bạn sẽ nhận được số dòng và thông báo lỗi từ trình biên dịch.
Thực Hành Tốt Nhất
Địa Chỉ Chữ Thường
Luôn sử dụng lower() để khớp địa chỉ không phân biệt chữ hoa chữ thường:
# Good: Normalized comparison
deny if {
lower(input.to_address) == "0xdead..."
}
# Bad: May miss matches due to case differences
deny if {
input.to_address == "0xDead..."
}Xử Lý Trường Nullable
Một số trường đầu vào có thể là null. Xử lý điều này một cách cẩn thận:
# 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
}Kiểm Tra Kỹ Lưỡng
Trước khi triển khai chính sách vào sản xuất:
- Kiểm tra với nhiều tổ hợp đầu vào khác nhau
- Xác minh cả trường hợp cho phép và từ chối
- Kiểm tra các trường hợp biên (giá trị null, mảng rỗng)
- Xác thực với dữ liệu giao dịch thực tế
Tài Liệu Hóa Quy Tắc Của Bạn
Sử dụng chú thích để giải thích logic phức tạp:
# 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
}Sử Dụng Tên Biến Có Ý Nghĩa
Khi sử dụng biến cục bộ, chọn tên mô tả:
# 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
}