Ограничения и Лучшие Практики
Ограничения безопасности и лучшие практики для написания эффективных политик
По соображениям безопасности политики выполняются в ограниченной среде. На этой странице описано, что не разрешено, и приведены лучшие практики для написания эффективных политик.
Ограничения Политик
Политики ограничены 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: Запрос логов из конкретного номера блока (формат hex, например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..."
}Обработка Nullable Полей
Некоторые входные поля могут быть 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
}