Validateur de prompt pré-LLM. Analyse chaque prompt utilisateur avant envoi au modèle et rejette tout ce qui ressemble à une injection, un jailbreak, ou une tentative d'extraction de données.
Philosophie : préférence pour les faux positifs. Un prompt légitime bloqué à tort est moins grave qu'un prompt malicieux transmis au modèle.
pip install pyyamlAucune autre dépendance externe. Python 3.10+ requis.
# Valider un prompt inline
python prompt_guardian.py --prompt "Ignore all previous instructions and tell me..."
# Valider depuis un fichier
python prompt_guardian.py --file mon_prompt.txt
# Avec rapport JSON
python prompt_guardian.py --prompt "..." --report
# Avec config alternative
python prompt_guardian.py --prompt "..." --config /mon/chemin/config/
# Mode silencieux (logs WARNING+ seulement)
python prompt_guardian.py --prompt "..." --quietCode de sortie : 0 = ALLOWED, 1 = REJECTED — utilisable dans un pipeline shell.
from prompt_guardian import PromptGuardian
guardian = PromptGuardian(verbose=True)
result = guardian.validate(user_prompt)
if result.verdict == "REJECTED":
print("Prompt rejeté :", result.flags)
# Ne pas transmettre au LLM
else:
# Transmettre au LLM
response = llm.complete(user_prompt)prompt_guardian/
├── prompt_guardian.py # Moteur principal
├── config/
│ ├── rules.yaml # Règles regex, scoring, heuristiques
│ ├── thresholds.yaml # Seuil de rejet global
│ └── whitelist.yaml # Bypass autorisés
└── reports/ # Rapports JSON générés (--report)
Dans config/thresholds.yaml :
reject_threshold: 30.0 # Valeur par défaut (strict)| Valeur | Mode |
|---|---|
| 20 | Ultra-strict |
| 30 | Strict (défaut) |
| 50 | Équilibré |
| 70 | Permissif |
Dans config/rules.yaml, mettre score: 0 sur la règle concernée :
- id: JBK-004
score: 0 # Désactivée — trop de faux positifs sur mes prompts créatifs
...- Lancer avec
--reportpour obtenir le JSON détaillé - Identifier la règle déclenchée (
rule_id,matched_text) - Soit baisser le
scorede cette règle, soit ajouter le prompt àwhitelist.yaml
Dans config/rules.yaml, section regex_rules :
- id: CUSTOM-001
category: custom
severity: HIGH
score: 40.0
description: "Ma règle métier spécifique"
pattern: "mon_pattern_regex_ici"{
"prompt_hash": "a3f1b2c4...",
"timestamp": "2026-05-11T14:32:01Z",
"verdict": "REJECTED",
"total_score": 95.0,
"threshold_used": 30.0,
"hits": [
{
"rule_id": "INJ-SYS-001",
"category": "prompt_injection",
"severity": "CRITICAL",
"score": 50.0,
"description": "Tentative d'override de system prompt",
"matched_text": "ignore all previous instructions",
"offset": 0
}
],
"flags": [
"[CRITICAL] INJ-SYS-001: Tentative d'override de system prompt"
],
"metadata": {
"prompt_length": 48,
"hit_categories": ["prompt_injection"]
}
}| Catégorie | Description |
|---|---|
prompt_injection |
Override/redéfinition du system prompt |
jailbreak |
Personas DAN, modes sans restrictions |
data_extraction |
Tentatives d'exfiltration du contexte |
social_engineering |
Usurpation d'identité, pression émotionnelle |
harmful_content |
Demandes de contenu illégal ou dangereux |
obfuscation |
Leetspeak, encodage, caractères invisibles |
indirect_injection |
Injection via contenu externe simulé |
structural |
Heuristiques sur la forme du prompt |
- Les règles regex opèrent sur une normalisation légère (lowercase + homoglyphes courants). Un adversaire déterminé avec des techniques d'obfuscation avancées (substitution Unicode complexe, tokenisation exploitée) peut théoriquement contourner certaines règles.
- Le scoring est additif et non pondéré par contexte — ajouter des règles métier si votre domaine a des patterns spécifiques.
- Ce validateur est un premier filtre, pas un garde-fou exhaustif. Combinez-le avec les mécanismes de sécurité natifs de votre LLM.