diff --git a/Systeme-Anti-Triche.-.md b/Systeme-Anti-Triche.-.md new file mode 100644 index 0000000..a9282e9 --- /dev/null +++ b/Systeme-Anti-Triche.-.md @@ -0,0 +1,212 @@ +# ๐Ÿ”’ Systรจme Anti-Triche + +> QR code rotatif, tokens uniques et mรฉcanismes de protection de la file. + +--- + +## Problรฉmatique + +Dans une file d'attente classique (numรฉro papier), plusieurs fraudes sont possibles : + +| Fraude | Description | Impact | +|:-------|:------------|:-------| +| **Partage de lien** | Un patient partage le lien d'inscription ร  un ami | L'ami rejoint sans รชtre prรฉsent | +| **Inscription ร  distance** | Un patient s'inscrit depuis chez lui | Occupe une place sans รชtre lร  | +| **Double inscription** | Un patient s'inscrit plusieurs fois | Monopolise la file | +| **Usurpation** | Quelqu'un prend la place d'un autre | Injustice pour les autres | + +--- + +## Solution : Token QR Rotatif + +### Principe + +Le QR code affichรฉ au cabinet contient un **token unique** qui change rรฉguliรจrement. Pour rejoindre la file, le patient doit scanner le QR code **physiquement prรฉsent** au cabinet. + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ โ”‚ +โ”‚ ROTATION DU TOKEN QR (exemple : toutes les 30 minutes) โ”‚ +โ”‚ โ”‚ +โ”‚ 08:00 08:30 09:00 09:30 10:00 โ”‚ +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ +โ”‚ โ–ผ โ–ผ โ–ผ โ–ผ โ–ผ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ T1 โ”‚ โ”‚ T2 โ”‚ โ”‚ T3 โ”‚ โ”‚ T4 โ”‚ โ”‚ T5 โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ +โ”‚ โ–ผ โ–ผ โ–ผ โ–ผ โ–ผ โ”‚ +โ”‚ QR code QR code QR code QR code QR code โ”‚ +โ”‚ affichรฉ affichรฉ affichรฉ affichรฉ affichรฉ โ”‚ +โ”‚ change change change change change โ”‚ +โ”‚ โ”‚ +โ”‚ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”‚ +โ”‚ โ”‚ +โ”‚ Patient A scanne T2 ร  08:45 โ†’ โœ… Token valide โ†’ Rejoint la file โ”‚ +โ”‚ Patient A partage le lien ร  09:05 โ†’ โŒ T2 expirรฉ โ†’ Rejetรฉ โ”‚ +โ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### Fonctionnement Technique + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ โ”‚ +โ”‚ 1. Gร‰Nร‰RATION โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ qrToken = crypto.randomBytes(32).toString('hex') โ”‚ โ”‚ +โ”‚ โ”‚ qrTokenExpiresAt = now() + rotationMinutes โ”‚ โ”‚ +โ”‚ โ”‚ โ†’ Stockรฉ dans table `clinics` โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ 2. ENCODAGE DANS LE QR CODE โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ URL = https://app.queuemed.fr/queue/{qrToken} โ”‚ โ”‚ +โ”‚ โ”‚ โ†’ Le token EST l'URL d'accรจs โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ 3. VALIDATION ร€ L'INSCRIPTION โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ if (clinic.qrToken !== submittedToken) โ†’ โŒ REJETร‰ โ”‚ โ”‚ +โ”‚ โ”‚ if (clinic.qrTokenExpiresAt < now()) โ†’ โŒ EXPIRร‰ โ”‚ โ”‚ +โ”‚ โ”‚ else โ†’ โœ… ACCEPTร‰, crรฉer queueEntry โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ 4. ROTATION AUTOMATIQUE โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ Toutes les N minutes (configurable par cabinet) : โ”‚ โ”‚ +โ”‚ โ”‚ โ†’ Nouveau token gรฉnรฉrรฉ โ”‚ โ”‚ +โ”‚ โ”‚ โ†’ QR code affichรฉ se met ร  jour โ”‚ โ”‚ +โ”‚ โ”‚ โ†’ Anciens liens deviennent invalides โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## Configuration par Cabinet + +Le mรฉdecin peut configurer la frรฉquence de rotation pour chaque cabinet : + +| Frรฉquence | Cas d'usage | Sรฉcuritรฉ | UX Patient | +|:-----------|:------------|:---------|:-----------| +| **5 min** | Cabinet trรจs frรฉquentรฉ, risque de fraude รฉlevรฉ | ๐ŸŸข๐ŸŸข๐ŸŸข Maximale | โš ๏ธ QR change souvent | +| **15 min** | Cabinet standard, bonne affluence | ๐ŸŸข๐ŸŸข ร‰levรฉe | ๐ŸŸข Confortable | +| **30 min** | Cabinet calme, risque faible (dรฉfaut) | ๐ŸŸข Bonne | ๐ŸŸข๐ŸŸข Trรจs confortable | +| **60 min** | Cabinet peu frรฉquentรฉ | ๐ŸŸก Modรฉrรฉe | ๐ŸŸข๐ŸŸข๐ŸŸข Aucune gรชne | +| **24h** | Cabinet de confiance, pas de fraude | ๐Ÿ”ด Minimale | ๐ŸŸข๐ŸŸข๐ŸŸข Aucune gรชne | +| **0 (dรฉsactivรฉ)** | Pas de rotation | โŒ Aucune | โ€” | + +### Recommandation + +> Pour la plupart des cabinets, **30 minutes** offre le meilleur compromis entre sรฉcuritรฉ et confort d'utilisation. + +--- + +## Protections Supplรฉmentaires + +### Anti-Double Inscription + +``` +Patient scanne le QR code + โ”‚ + โ–ผ +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ Vรฉrification du patientToken existant โ”‚ +โ”‚ โ”‚ +โ”‚ SELECT * FROM queue_entries โ”‚ +โ”‚ WHERE clinicId = ? AND patientToken = ? โ”‚ +โ”‚ AND status IN ('waiting', 'called') โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”‚ +โ”‚ Rรฉsultat trouvรฉ ? โ”€โ”€โ”€โ”€ OUI โ”€โ”€โ–ถ โŒ Dรฉjร  โ”‚ +โ”‚ โ”‚ inscrit โ”‚ +โ”‚ NON โ”‚ +โ”‚ โ”‚ โ”‚ +โ”‚ โ–ผ โ”‚ +โ”‚ โœ… Crรฉer nouvelle entrรฉe โ”‚ +โ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### Token Patient Unique + +Chaque patient reรงoit un `patientToken` unique (cookie de session) qui empรชche : +- La double inscription depuis le mรชme appareil +- L'usurpation de position d'un autre patient + +### Taille Maximum de File + +| Paramรจtre | Dรฉfaut | Description | +|:-----------|:-------|:------------| +| `maxQueueSize` | 50 | Nombre max de patients en attente | + +Quand la file est pleine, les nouveaux patients voient un message : + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ โ”‚ +โ”‚ โš ๏ธ File d'attente complรจte โ”‚ +โ”‚ โ”‚ +โ”‚ Le cabinet a atteint sa capacitรฉ โ”‚ +โ”‚ maximale. Veuillez rรฉessayer plus โ”‚ +โ”‚ tard ou contacter le cabinet. โ”‚ +โ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## Rotation Manuelle + +Le mรฉdecin peut forcer une rotation immรฉdiate du token QR depuis l'interface : + +``` +Bouton "๐Ÿ”„ Forcer rotation" dans la fiche cabinet + โ”‚ + โ–ผ +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ 1. Gรฉnรจre un nouveau token alรฉatoire โ”‚ +โ”‚ 2. Met ร  jour qrToken en DB โ”‚ +โ”‚ 3. Recalcule qrTokenExpiresAt โ”‚ +โ”‚ 4. Le QR code affichรฉ change โ”‚ +โ”‚ 5. Anciens liens โ†’ invalides โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +**Cas d'usage :** Si le mรฉdecin suspecte qu'un patient a partagรฉ le lien, il peut forcer la rotation pour invalider immรฉdiatement tous les anciens liens. + +--- + +## Scรฉnarios de Fraude et Rรฉponses + +| Scรฉnario | Tentative | Rรฉponse QueueMed | +|:---------|:----------|:-----------------| +| Partage de lien WhatsApp | Patient A envoie le lien ร  Patient B | Token expirรฉ โ†’ B rejetรฉ | +| Screenshot du QR | Photo du QR envoyรฉe ร  distance | Token expirรฉ โ†’ Rejetรฉ | +| Inscription depuis chez soi | Patient connaรฎt l'URL du cabinet | Token requis โ†’ Impossible | +| Bot d'inscription | Script automatisรฉ | Rate limiting + token | +| Double inscription | Mรชme patient, 2 appareils | patientToken unique โ†’ Bloquรฉ | + +--- + +## Limites Connues + +| Limite | Description | Mitigation | +|:-------|:------------|:-----------| +| Fenรชtre de validitรฉ | Pendant la durรฉe du token, le lien fonctionne | Rรฉduire la rotation | +| Mรชme rรฉseau WiFi | Partage possible si mรชme rรฉseau | Rotation courte | +| Prรฉsence physique | Ne vรฉrifie pas la gรฉolocalisation | Rotation + surveillance | + +> **Note :** Le systรจme anti-triche n'est pas infaillible mais rend la fraude suffisamment difficile pour dรฉcourager la grande majoritรฉ des tentatives. La rotation courte (5-15 min) est recommandรฉe pour les cabinets ร  risque. + +--- + +
+ +**[[Home]] | [[Architecture-Technique]] | [[Temps-Reel]] | [[Guide-Patient]]** + +