Back to flin
flin

Fonctions de validation et d'assainissement

Comment FLIN embarque 67 fonctions de validation et d'assainissement -- de la vérification d'e-mail et d'URL à l'assainissement HTML et la prévention d'injection SQL, le tout sans importer de bibliothèque.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 4 min flin
EN/ FR/ ES
flinvalidationsanitizationinput

Chaque application web a la même vulnérabilité : les entrées utilisateur. Un champ de formulaire qui attend une adresse e-mail reçoit une injection JavaScript. Une barre de recherche qui attend du texte reçoit une requête SQL. Un champ de commentaire qui attend des mots reçoit une balise <script>. La seule défense est la validation (rejeter les entrées invalides) et l'assainissement (neutraliser les entrées dangereuses).

Dans la plupart des langages, cette défense nécessite l'installation de packages. validator pour JavaScript. django.core.validators pour Python. govalidator pour Go. Chaque package a sa propre API, ses propres cas limites et ses propres vulnérabilités. En FLIN, la validation et l'assainissement sont intégrés dans le langage. Les Sessions 131 et 190 à 192 ont ajouté 67 fonctions qui couvrent chaque besoin de validation et d'assainissement d'une application web.

Les deux lignes de défense

FLIN sépare la validation (vérifier si l'entrée est valide) de l'assainissement (rendre l'entrée sûre). Les deux sont nécessaires.

flin// Validation : cette entrée est-elle acceptable ?
email = "[email protected]"
email.is_email              // true -- l'accepter

// Assainissement : rendre cette entrée sûre pour l'affichage
comment = "<script>alert('xss')</script>Hello!"
safe = sanitize_html(comment)
// "Hello!" -- la balise script est supprimée

Fonctions de validation

flintext.is_email              // Vérification e-mail RFC 5322 simplifiée
text.is_url                // URL valide avec protocole
text.is_ip                 // Adresse IPv4 ou IPv6
text.is_uuid               // Format UUID v4
text.is_json               // Chaîne JSON valide
text.is_numeric            // Tous des chiffres (0-9)
text.is_alpha              // Toutes des lettres (a-z, A-Z)
text.is_phone              // Format de numéro de téléphone international
text.is_credit_card        // Numéro de carte de crédit (vérification Luhn)

Fonctions d'assainissement

flin// Niveau 1 : Échapper les entités HTML
html_escape("<script>alert('xss')</script>")
// "&lt;script&gt;alert('xss')&lt;/script&gt;"

// Niveau 2 : Supprimer toutes les balises HTML
strip_tags("<b>Hello</b> <script>evil()</script> World")
// "Hello  World"

// Niveau 3 : Assainir le HTML (garder les balises sûres)
sanitize_html("<b>Bold</b> <script>evil()</script> <a href='url'>Link</a>")
// "<b>Bold</b>  <a href='url'>Link</a>"

// Prévention d'injection SQL
safe = escape_sql("Robert'; DROP TABLE users; --")
// "Robert''; DROP TABLE users; --"

// Encodage URL
url_encode("hello world & more")
// "hello%20world%20%26%20more"

Validation au niveau des entités

Le système d'entités de FLIN intègre la validation au niveau du schéma en utilisant les contraintes where :

flinentity Product {
    name: text where len >= 1 and len <= 200
    description: text where len <= 5000
    price: float where > 0
    sku: text where matches("^[A-Z]{2}-\\d{4}$")
    email: text where is_email
    url: text? where is_url
    category: text where in ["electronics", "clothing", "food", "other"]
}

Ces contraintes sont vérifiées automatiquement lors des opérations create et update. Si une contrainte échoue, l'opération retourne une erreur avec un message descriptif.

Soixante-sept fonctions, zéro vulnérabilité

L'API complète de validation et d'assainissement :

  • 15 validateurs de format (e-mail, URL, IP, UUID, téléphone, carte de crédit, etc.)
  • 5 validateurs de contenu (numérique, alpha, alphanumérique, vide, blanc)
  • 6 validateurs de longueur/plage
  • 1 validateur de pattern (matches)
  • 3 assainisseurs HTML (html_escape, strip_tags, sanitize_html)
  • 2 assainisseurs SQL (escape_sql, escape_sql_like)
  • 2 encodeurs URL (url_encode, url_decode)
  • 2 assainisseurs de chemin (sanitize_path, path_within)
  • 2 codeurs base64 (base64_encode, base64_decode)
  • 28 mots-clés de contrainte d'entité (where, in, between, matches, etc.)

Soixante-sept fonctions qui remplacent validator, sanitize-html, xss, dompurify, express-validator et une douzaine d'autres packages liés à la sécurité.


Ceci est la partie 79 de la série "How We Built FLIN", documentant comment un CEO à Abidjan et un CTO IA ont construit la validation et l'assainissement des entrées directement dans un langage de programmation.

Navigation de la série : - [78] Reduce, Map, Filter: Higher-Order Functions - [79] Validation and Sanitization Functions (vous êtes ici) - [80] Error Tracking and Performance Monitoring - [81] FlinUI: Zero-Import Component System

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude thales

Treize agents, quarante-trois minutes : la première session Workflow de Claude Fable 5, et ce qu'un script d'orchestration déterministe change aux builds multi-agents

Un prompt, treize agents, quarante-trois minutes : la première session de production avec Claude Fable 5 et l'outil Workflow de Claude Code a livré un site web de production complet de sept pages plus un endpoint backend de capture de leads, en un seul commit. Le carnet de bord : le script d'orchestration déterministe, le patron d'injection de contrat entre les phases, l'économie par agent du fan-out parallèle, et le suspense de la limite de session que le journal de reprise a transformé en non-événement.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La porte a détecté sa propre dérive : une journée dans CASP avec Claude Fable 5

Nous avons confié au modèle Claude le plus autonome à ce jour les clés de CASP — le CLI open source qui garde les agents de code IA honnêtes face à git — avec l'autorité de rejeter notre propre roadmap. Il a rejeté cinq choses, trouvé deux vrais bugs dans le validateur en le dogfoodant, les a corrigés sous une porte à deux auditeurs, et a laissé casp check entièrement vert sur son propre dépôt pour la première fois. CASP 0.3.0 en est le résultat.

16 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9
Thales & Claude zerosuite

La transplantation du CASP : comment la discipline des six fichiers est passée de Conductor à un ERP transport anti-fraude, ce que la compétence /next ajoute quand l'opérateur tape juste « next », et pourquoi le coût d'une dérive du CASP grimpe quand le projet, c'est l'argent des autres

La discipline du CASP qui a piloté trente-cinq sessions de Conductor est agnostique au produit. Le carnet de bord de sa transplantation sur KASSIA, un ERP transport anti-fraude pour un exploitant de flotte en Côte d'Ivoire : ce qui a migré, ce qui n'a pas migré (le validateur sur mesure — et ce que son absence coûte), ce que la compétence /next ajoute quand l'opérateur tape un seul mot, et là où le CASP s'arrête — le bug de déploiement qu'il ne pouvait pas voir parce qu'il enregistre l'intention, pas la réalité de l'infrastructure.

23 min Jun 8, 2026
kassiaerp-kassia-transport-logistiquezerosuiteCASP +15