# Un bloc et Cloudflare Turnstile : protéger un formulaire sans reCAPTCHA

> Intégrer Cloudflare Turnstile dans un bloc formulaire personnalisé, avec validation côté serveur, pour se passer d'un reCAPTCHA visible et intrusif.

- Auteur : WordPress Développement
- Publié le : 2022-09-29
- Mis à jour le : 2026-09-30
- Catégorie : Blocs Gutenberg
- URL : https://www.wpmoderne.fr/blocs/bloc-cloudflare-turnstile-formulaire-sans-recaptcha/

## L’essentiel

- Widget Turnstile intégré au bloc, sans case à cocher imposée
- Validation du jeton faite côté serveur avant tout traitement
- Alternative plus discrète qu'un reCAPTCHA classique

« Sélectionnez toutes les images contenant un feu tricolore » : ce type de défi visuel, aussi familier soit-il, agace une partie des visiteurs et pose un vrai problème d'accessibilité pour les personnes malvoyantes. Une alternative existe, plus discrète, reposant sur une analyse silencieuse du comportement du navigateur plutôt que sur un défi visuel imposé systématiquement.

Sur un bloc de formulaire de contact personnalisé, cette alternative s'intègre en ajoutant un widget dans le rendu du bloc, puis en vérifiant le jeton généré auprès du service, côté serveur, avant tout traitement de la soumission.

## Comment fonctionne la vérification côté client

Le widget s'affiche dans une zone dédiée du formulaire et exécute une série de vérifications silencieuses côté navigateur. À l'issue de cette vérification, un jeton est généré et inséré automatiquement dans un champ caché du formulaire, prêt à être transmis avec le reste des données.

```
<div class="cf-turnstile" data-sitekey="0x4AAA...votre-cle-publique"></div>
```

> L'essentiel à retenir : Widget Turnstile intégré au bloc, sans case à cocher imposée ; Validation du jeton faite côté serveur avant tout traitement ; Alternative plus discrète qu'un reCAPTCHA classique

## Charger le script uniquement là où il sert

Comme pour tout script tiers, il ne doit être chargé que sur les pages contenant réellement le bloc formulaire concerné, via un contrôle `has_block()` classique :

```
function wpmoderne_enqueue_turnstile() {
    if ( ! has_block( 'wpmoderne/formulaire-contact' ) ) {
        return;
    }
    wp_enqueue_script(
        'cf-turnstile',
        'https://challenges.cloudflare.com/turnstile/v0/api.js',
        array(),
        null,
        true
    );
}
add_action( 'wp_enqueue_scripts', 'wpmoderne_enqueue_turnstile' );
```

## Vérifier le jeton côté serveur, jamais côté client

La présence du champ caché ne prouve rien en soi : rien n'empêche un script malveillant de soumettre le formulaire sans jeton valide, voire avec une valeur arbitraire. La seule vérification fiable se fait côté serveur, par un appel à l'API de vérification, avec la clé secrète associée au site :

```
function wpmoderne_verifier_turnstile( $jeton ) {
    $reponse = wp_remote_post( 'https://challenges.cloudflare.com/turnstile/v0/siteverify', array(
        'body' => array(
            'secret'   => TURNSTILE_SECRET_KEY,
            'response' => $jeton,
        ),
    ) );

    if ( is_wp_error( $reponse ) ) {
        return false;
    }

    $corps = json_decode( wp_remote_retrieve_body( $reponse ), true );
    return ! empty( $corps['success'] );
}

function wpmoderne_traiter_formulaire_contact( WP_REST_Request $request ) {
    $jeton = sanitize_text_field( $request->get_param( 'cf-turnstile-response' ) );

    if ( ! wpmoderne_verifier_turnstile( $jeton ) ) {
        return new WP_Error( 'verification_echouee', 'Vérification anti-spam échouée, réessayez.', array( 'status' => 403 ) );
    }

    // Traitement normal du formulaire ici.
    return array( 'succes' => true );
}
```

## Ce que cette approche change concrètement

- Aucun défi visuel imposé par défaut : le widget reste souvent invisible, sauf cas jugé suspect par l'analyse comportementale.
- Aucune dépendance à une bibliothèque JavaScript tierce autre que le script officiel chargé depuis le domaine Cloudflare.
- Un taux de faux rejets à surveiller sur les premières semaines : un visiteur avec un bloqueur de scripts agressif peut se retrouver sans jeton valide, un cas à gérer avec un message clair plutôt qu'un blocage silencieux.

## Ce que cet article ne couvre pas

La configuration réseau plus large d'un compte Cloudflare — règles de pare-feu applicatif (WAF), gestion du cache, certificats — reste un sujet à part entière, indépendant de ce widget de vérification embarqué dans un formulaire. Ce billet se limite volontairement à la protection d'un formulaire précis, pas à une architecture de sécurité complète.

## En résumé

Remplacer un reCAPTCHA visible par une vérification comportementale plus discrète améliore l'expérience du formulaire sans renoncer à la protection anti-spam, à condition de ne jamais faire confiance au seul champ caché côté client : la vérification côté serveur reste l'étape qui protège réellement le traitement des données soumises.
