Restrictions et Meilleures Pratiques

Restrictions de sécurité et meilleures pratiques pour rédiger des politiques efficaces

Pour des raisons de sécurité, les politiques s'exécutent dans un environnement restreint. Cette page documente ce qui n'est pas autorisé et fournit les meilleures pratiques pour rédiger des politiques efficaces.

Limites de Politique

Les politiques sont limitées à 2 048 caractères de longueur. Cela encourage des règles concises et ciblées et garantit des temps d'évaluation rapides.


Restrictions au Niveau de la Plateforme

Les méthodes RPC suivantes sont bloquées au niveau de la plateforme et ne peuvent être activées par aucune politique :

CategoryMethods
Debug & Tracedebug_*, trace_*
Legacy Filterseth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter

Ces restrictions s'appliquent à toutes les requêtes, quelle que soit l'organisation ou les politiques de point de terminaison.


Limitations de eth_getLogs

La méthode eth_getLogs est limitée aux requêtes de bloc unique uniquement. Vous devez spécifier soit :

  • block_hash : Interroger les logs d'un hash de bloc spécifique
  • block_number : Interroger les logs d'un numéro de bloc spécifique (format hex comme 0x100 ou tags comme latest)

Les requêtes de plage de blocs utilisant fromBlock et toBlock ne sont pas supportées. Cette restriction s'applique aux requêtes RPC et MCP.


Mots-Clés Bloqués

Les modèles suivants ne sont pas autorisés dans les politiques :

PatternReason
import ...Cannot import external modules
package ...Cannot declare packages
default ...Cannot override default values
data.*Cannot reference external data

Les politiques tentant d'utiliser ces modèles échoueront à la validation.


Fonctions Intégrées Désactivées

Ces catégories de fonctions intégrées sont désactivées et seront rejetées :

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"

Les politiques utilisant des fonctions intégrées désactivées échoueront à la validation avec un message d'erreur clair indiquant quelle fonction n'est pas autorisée.


Erreurs de Validation

Lorsqu'une politique échoue à la validation, vous recevrez des erreurs comme :

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.

Lorsque la compilation échoue en raison d'une syntaxe Rego invalide, vous recevrez le numéro de ligne et le message d'erreur du compilateur.


Meilleures Pratiques

Adresses en Minuscules

Utilisez toujours lower() pour la correspondance d'adresses insensible à la casse :

# Good: Normalized comparison
deny if {
    lower(input.to_address) == "0xdead..."
}
 
# Bad: May miss matches due to case differences
deny if {
    input.to_address == "0xDead..."
}

Gérer les Champs Nullables

Certains champs d'entrée peuvent être null. Gérez cela avec précaution :

# 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
}

Tester Minutieusement

Avant de déployer des politiques en production :

  1. Testez avec diverses combinaisons d'entrées
  2. Vérifiez les cas d'autorisation et de refus
  3. Vérifiez les cas limites (valeurs null, tableaux vides)
  4. Validez avec des données de transactions réalistes

Documentez Vos Règles

Utilisez des commentaires pour expliquer la logique complexe :

# 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
}

Utilisez des Noms de Variables Significatifs

Lors de l'utilisation de variables locales, choisissez des noms descriptifs :

# 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
}
Restrictions et Meilleures Pratiques | 256 Blocks