Aller au contenu

La friction

phil/bot-detection-bundle

Un verdict n'est pas un refus. Un verdict est calculé chez le client : il peut donc être falsifié, et un faux positif doit tout de même passer. Le résultat le plus fort d'un verdict est donc une étape de friction de plus.

État : Friction et FrictionPolicy sont implémentés et testés.

Friction

Une énumération pure avec exactement deux cas :

Casadds()Sens
Friction::NonefalseLa requête se poursuit comme d'habitude
Friction::SteptrueLa requête reçoit une étape de friction de plus

Il n'y a délibérément aucun cas Refuse, et les tests vérifient que Friction::cases() vaut exactement [None, Step].

L'application donne son sens à Step sur chaque surface, par exemple :

  • une étape de recul de plus sur un limiteur de débit d'inscription ;
  • un défi d'authentification plus fort imposé, ou une étape de plus sur un limiteur de tentatives de paiement ;
  • un accès que la mesure d'audience ne compte pas.

L'étape n'enregistre jamais pourquoi elle a été ajoutée. Elle se fond dans l'état de ce qu'elle ralentit (le compteur d'un limiteur, l'exigence d'un défi), et cet état ne garde pas le verdict.

FrictionPolicy

Traduit un verdict en friction. La correspondance est fixe par conception, à un choix près :

VerdictrobotOnly()robotOrUnknown()
HumanNoneNone
RobotStepStep
UnknownNoneStep
$policy = FrictionPolicy::robotOrUnknown();
$policy->unknownAddsFriction;              // true
$policy->frictionFor(Verdict::Unknown);    // Friction::Step

FrictionPolicy::robotOnly()->frictionFor(Verdict::Unknown); // Friction::None

Le constructeur est privé : les deux constructeurs nommés sont les seules politiques.

Choisir, surface par surface

PolitiqueCoûtÀ utiliser quand
robotOnly()Un client peut éviter la détection en n'envoyant rienLa friction coûte cher à une personne (un paiement), ou le code du navigateur n'est pas encore déployé sur la surface
robotOrUnknown()Ralentit les clients qui n'ont jamais exécuté le script de détection, et aussi les personnes dont le navigateur bloque les scriptsL'abus coûte peu et la friction est légère (un recul à l'inscription)

Sur une surface où le contrôleur verdict n'est pas placé, chaque verdict est Unknown : robotOrUnknown() ajoute alors une étape à chaque requête de cette surface.

Ce que la politique ne décide pas

Un navigateur qui résiste à la prise d'empreinte n'est pas un robot. Des signaux aléatoires ou vidés, tels que les produisent les navigateurs axés sur la vie privée, ne doivent pas déclencher un détecteur. C'est une propriété des détecteurs du navigateur, pas de cette politique : quand un verdict atteint le serveur, il est déjà robot ou human (browser-signals.md).

Les robots d'indexation déclarés (les bons robots qui s'annoncent dans leur agent utilisateur) relèvent du serveur, qui en décide à partir de l'agent utilisateur avec une liste de robots comme jaybizzle/crawler-detect, et non de ce bundle.