← HTTP — sécurité avancée, 40 leçons de cours

Module 12 / 40 · 90 min

12. Same-origin policy : lecture et envoi

Décrire ce que le navigateur limite réellement.

Lessons, exercises and questions in this path are in French. The interface follows the site language.

Your progress will appear here when JavaScript is active.

Progress and best score are stored only in this browser. No account is needed; clearing browser data removes them. Module times are estimates including exercises.

Comprendre le mécanisme

La politique de même origine borne plusieurs accès entre documents ou ressources d’origines différentes. Elle protège notamment certaines lectures et interactions, mais n’interdit pas uniformément tout envoi interorigine. Une image distante, une navigation ou un formulaire peuvent encore produire du trafic dans les conditions prévues par le navigateur. Ce modèle explique pourquoi l’absence d’une permission de lecture CORS ne prouve pas qu’une action serveur n’a pas été déclenchée.

Raisonner et vérifier

Construisez votre modèle de menace avec deux questions distinctes : la demande part-elle, et le script peut-il exploiter la réponse ? Un serveur doit autoriser les mutations même si la page appelante ne pourra pas lire leur résultat. Les mécanismes CSRF, l’authentification et la politique de cookies complètent cette frontière. Testez avec deux origines de laboratoire plutôt qu’une page unique.

Frontière de lecture

La SOP limite certains accès entre origines. Lecture et émission de requête ont des règles distinctes. La SOP limite certains accès entre origines depuis le navigateur. Elle ne constitue pas une authentification du client ni une interdiction universelle pour les demandes qui atteignent le serveur.

Understand this common mistake

La SOP interdit tout envoi inter-origines.

Lecture et émission de requête ont des règles distinctes.

Ressource intégrée

Une image externe peut être demandée sans lecture libre du contenu. Chargement et exposition au script ne sont pas équivalents. Une image externe peut être chargée sans donner au script une lecture libre de son contenu. Distinguez déclenchement réseau, affichage et accès programmatique aux données de la réponse.

Understand this common mistake

Une requête d’image prouve l’accès JavaScript à tous ses octets.

Chargement et exposition au script ne sont pas équivalents.

Formulaire externe

Un formulaire peut déclencher une requête inter-origines. Le serveur doit protéger les mutations pertinentes. Un formulaire hébergé ailleurs peut envoyer une demande vers votre service selon les règles navigateur. Si une identité est jointe, l’effet doit être contrôlé même lorsque la réponse reste illisible au site initiateur.

Understand this common mistake

La SOP suffit à empêcher tout CSRF.

Le serveur doit protéger les mutations pertinentes.

Partage CORS

CORS peut autoriser certaines lectures contrôlées. L’autorisation porte sur un contrat précis de partage. CORS peut autoriser certaines lectures que la politique d’origine limiterait autrement. Cette permission est évaluée par le navigateur et ne remplace pas les contrôles serveur sur acteur et ressource.

Understand this common mistake

CORS désactive toutes les protections du navigateur.

L’autorisation porte sur un contrat précis de partage.

Client serveur

Un client serveur n’est pas régi comme un script navigateur par la SOP. Les clients directs demandent des contrôles serveur. Un script curl ou un backend peut contacter l’API sans appliquer la SOP du navigateur. Protégez donc les données par une authentification et des règles d’accès réelles côté serveur.

Understand this common mistake

La SOP est le pare-feu de toutes les API clientes.

Les clients directs demandent des contrôles serveur.

Contrôle API

L’authentification doit être vérifiée côté API. Une politique de lecture n’établit pas l’identité. L’API doit vérifier credentials et droits sur chaque opération sensible. Le fait qu’un frontend soit déployé sur une origine connue ne rend pas toutes les demandes reçues authentiques ou autorisées.

Understand this common mistake

Bloquer une lecture navigateur authentifie l’émetteur.

Une politique de lecture n’établit pas l’identité.

Frames

Les frames conservent des frontières d’accès. L’intégration ne fusionne pas automatiquement les origines. Un document intégré depuis une autre origine conserve des restrictions d’accès. N’en déduisez pas qu’il ne peut pas afficher une interface trompeuse ; le framing et le clickjacking demandent aussi une politique.

Understand this common mistake

Toute page intégrée devient du code de la même origine.

L’intégration ne fusionne pas automatiquement les origines.

XSS locale

Une XSS de même origine peut agir dans le contexte de la page. Le script hostile peut bénéficier du contexte compromis. Une XSS s’exécute dans le contexte de l’origine compromise et peut agir avec ses capacités. La SOP ne protège pas cette page contre un code hostile déjà exécuté dans son propre périmètre.

Understand this common mistake

La SOP neutralise tout script injecté de même origine.

Le script hostile peut bénéficier du contexte compromis.

Mesures séparées

Les tests doivent distinguer réponse envoyée et réponse lisible. Le navigateur peut masquer une réponse déjà produite. Dans un laboratoire, observez le journal serveur puis la tentative de lecture JavaScript. Une erreur CORS dans la console peut coexister avec une demande reçue et un effet déjà produit.

Understand this common mistake

Une erreur CORS prouve qu’aucune requête n’est partie.

Le navigateur peut masquer une réponse déjà produite.

Autorisation objet

La permission sur l’objet reste une règle serveur. Le modèle du navigateur ne connaît pas ces règles métier. Même une lecture techniquement autorisée entre origines doit respecter les droits de l’acteur. Essayez un identifiant appartenant à un autre compte et vérifiez le refus sans fuite de contenu.

Understand this common mistake

La SOP valide automatiquement la propriété métier.

Le modèle du navigateur ne connaît pas ces règles métier.

Atelier guidé : lire, expliquer et vérifier le code

<form method="post" action="https://booking.example.test/lab/cancel">
  <input name="reservation" value="42">
</form>
<!-- Formulaire sur une autre origine ; le serveur doit appliquer ses contrôles. -->

Le formulaire cross-origin peut provoquer une demande sans offrir au site tiers la lecture de sa réponse. Il faut donc protéger l’annulation avant son effet, avec les contrôles adaptés au contexte de session. Testez séparément réception de la demande, décision serveur et visibilité de la réponse.

Le serveur doit vérifier sa défense CSRF. Un effet doit être protégé même si la réponse reste illisible au script tiers. La SOP n’est pas une interdiction universelle d’émission. Les formulaires peuvent soumettre des données.

Travail pratique : Créez deux origines locales et comparez chargement d’image, navigation et lecture par fetch. Sur B, utilisez un endpoint sans mutation.

Critères de correction : Relevez les requêtes reçues puis les accès possibles depuis le script. Classez les résultats par mécanisme et gardez les mutations derrière une politique serveur indépendante de l’accès à la réponse.

Worked example

Origine A : page et script
Origine B : ressource distante
Observation 1 : demande reçue par B
Observation 2 : lecture permise ou refusée dans A

Les deux observations peuvent diverger. Le refus de lecture dans A n’annule pas automatiquement un effet déjà produit dans B.

Practical exercise

Créez deux origines locales et comparez chargement d’image, navigation et lecture par fetch. Sur B, utilisez un endpoint sans mutation.

View a suggested solution

Relevez les requêtes reçues puis les accès possibles depuis le script. Classez les résultats par mécanisme et gardez les mutations derrière une politique serveur indépendante de l’accès à la réponse.

Verification checklist

  • Séparer émission et lecture.
  • Ne pas présenter SOP comme une autorisation.
  • Tester avec deux origines distinctes.

Knowledge check

Related lesson: 12. Same-origin policy : lecture et envoi ↗
Un refus de lecture interorigine prouve-t-il l’absence de requête reçue par le serveur ?

Reference documentation ↗

Module validation

101 questions, local practice target of 75%. Suggested duration of 150 minutes, with no enforced deadline. Questions and choices are shuffled; corrections appear after submission. The quick lesson check and the final course exam remain separate exercises.

Start or resume the 101 questions →