Date : 11 avril 2026 | Site : fonezone.tech | Dossier : C:\Users\artis\Desktop\FONEZONE
Scope : HTML, CSS, JS, Netlify Functions, Admin, Caisse, SEO, Securite
Fichiers : admin-general.html (L814), admin-tarifs.html (L125), checklist-employe.html, checklist-technicien.html, monitoring.html
Le mot de passe est encode en base64 atob('TW5hb3VhcjQ1QA==') — decodable en 1 seconde dans la console navigateur. C'est equivalent a du texte en clair.
FIX : Supprimer tous les mots de passe du code client. Utiliser JWT tokens via functions/auth.js. Changer le mot de passe immediatement.
Contient en clair : cles API ElevenLabs (sk_7ac3...), Runway ML, Creatomate, credentials n8n (cyberphone06150@gmail.com / Mnaouar45)
FIX : SUPPRIMER ce fichier immediatement. Revoquer et regenerer toutes les cles. Utiliser les variables d'environnement Netlify.
Fichier : admin-tarifs.html — Hash SHA256 compare en JavaScript. N'importe qui peut executer :
document.getElementById('login-screen').style.display = 'none';
document.getElementById('main-app').style.display = 'block';
loadTarifs(); // Acces total sans mot de passe
FIX : Toute authentification doit etre serveur-side via functions/auth.js + JWT tokens.
Actions debug_user et emergency_reset (L126-154) permettent de recuperer les hashes de mots de passe et de reset le compte admin avec juste la cle API.
FIX : Supprimer ces 2 actions. Implementer une recuperation securisee (email + OTP).
Lignes 71-74 : ['ayan', sha256('Ayan2024!'), ...] — Mots de passe en clair dans le code source, hashes SHA256 sans salt.
FIX : Utiliser bcrypt/Argon2 avec salt. Stocker dans Google Sheets hashe, pas dans le code.
Utilisee dans : cms.js, caisse.js, facturation.js, backup.js, fidelite.js, catalogue.js... Envoyee depuis le code client (visible dans DevTools).
FIX : Remplacer par JWT tokens avec roles (admin/magasin/technicien). Ne jamais exposer de cle en front-end.
Google Analytics (AW-18047568562) et Meta Pixel (2688342744084876) se chargent AVANT le cookie banner sur toutes les pages.
FIX : Bloquer fbq('init') et gtag() jusqu'a acceptation des cookies. Amende CNIL possible : 10 000-50 000 EUR.
Un attaquant peut envoyer des milliers de requetes pour creer des fausses factures, fiches, points fidelite sans limite.
FIX : Ajouter rate limiting : max 10 POST/min/IP sur tous les endpoints.
Les formulaires publics (reservation, devis, contact) n'ont pas de protection contre les requetes cross-site.
FIX : Ajouter un token CSRF unique par session sur chaque formulaire.
admin-general.html accepte du HTML brut pour les articles de blog. Un admin compromis peut injecter du JavaScript malveillant.
FIX : Ajouter DOMPurify.js pour nettoyer le HTML avant stockage.
Fichier : caisse.js L219-230
Les remboursements sont soustraits du CA global au lieu d'etre comptabilises separement. Le ticket Z est donc faux pour la comptabilite.
// Actuel (FAUX) : totalCA = ventes - remboursements // Correct : totalCA = ventes | remboursements = separe | especes_reelles = especes - remboursements_especes
FIX : Separer les remboursements dans une ligne dediee du ticket Z.
Les montants acceptent n'importe quelle valeur : negatifs, texte, nombres enormes. Pas de verification que TVA = HT * 0.20.
FIX : Valider cote serveur que montant > 0 et < 100000, mode_paiement dans ['CB','Especes','Virement','Cheque','Mixte'].
Fichier : caisse.js L224 — Si mode_paiement != cb/especes/virement/cheque/mixte, le montant est silencieusement ignore dans les totaux.
FIX : Rejeter les modes non reconnus avec erreur 400.
Impossible de savoir quelle facture correspond a quel paiement en caisse. Audit financier impossible.
FIX : Ajouter un champ "numero_facture" dans chaque ligne caisse.
Si le client recharge la page, un nouveau numero est consomme. Gaspillage de numeros de facture.
FIX : Generer le numero seulement au clic "Valider", pas au chargement.
Un employe peut ajouter 10 000 points sans motif ni lien avec une transaction.
FIX : Plafond de points par transaction, lien obligatoire avec un paiement caisse.
match-technicien.js assigne par distance uniquement, sans verifier si le technicien est disponible ou surcharge.
FIX : Verifier le planning du technicien avant assignation (max 8 RDV/jour).
localStorage.setItem('fz_checklist_ok','1'); location.reload(); // Acces total
FIX : Migrer vers FZAuth (auth.js serveur-side) pour toutes les pages admin.
Un employe "magasin" a les memes acces qu'un admin sur tous les endpoints CMS, caisse, facturation.
FIX : Verifier le role du token JWT sur chaque endpoint. Limiter les actions par role.
Tokens, preferences, panier — tout est en localStorage. Si un XSS passe, toutes les donnees sont volees.
FIX : Utiliser httpOnly cookies pour les tokens d'authentification.
Si un visiteur installe la PWA, il arrive directement sur la page admin.
FIX : Changer start_url vers /index.html.
Aucun tracking GA4 detecte sur les pages principales. Impossible de mesurer le trafic et les conversions.
FIX : Implementer GA4 avec consentement cookies sur toutes les pages.
Les pages villes reparation et reconditionnement ne sont pas toutes dans le sitemap. Google ne les indexera pas correctement.
FIX : Regenerer le sitemap avec toutes les URLs du site.
Google Merchant Center refusera les produits si tous ont la meme image (og-image.jpg).
FIX : Creer une image unique par produit (photo du telephone).
Le lien acompte 39,90 EUR n'est present qu'en footer de contact.html. Absent de : boutique, reparation, reconditionne, about.
FIX : Ajouter le CTA acompte sur toutes les pages service et boutique.
about.html (74 chars), reconditionne.html (68), reparation-nice.html (65), contact.html (61). Limite recommandee : 60 chars.
FIX : Raccourcir les titles en gardant le mot-cle principal + ville.
Tel : +33483441006 vs WhatsApp : 33771267864 — deux numeros differents, confusion pour les clients.
FIX : Standardiser un seul numero ou clarifier (fixe boutique vs mobile WhatsApp).
contact.html, about.html, reparation-cannes.html, reparation-nice.html — bloque le rendu initial.
FIX : Utiliser le pattern preload+async comme sur index.html.
40+ pages reparation-*.html partagent 70% du meme contenu. Risque de penalite Google pour duplicate content.
FIX : Ajouter 20+ lignes de contenu unique par ville (contexte local, quartiers, temoignages).
style.css (--black: #0a0a0a), boutique.css (meme), fz-design.css (--fz-black: #111111) — 2 noirs differents utilises en meme temps.
FIX : Fusionner les 3 :root en 1 seul systeme de variables coherent.
Casse la cascade CSS et rend le code inmaintenable.
FIX : Augmenter la specificite des selecteurs au lieu d'utiliser !important.
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box} dans style.css ET boutique.css. +1KB inutile.
FIX : Garder le reset uniquement dans style.css.
style.css + reconditionne.css + fz-design.css. Le dernier charge ecrase les autres.
FIX : Definir .btn-dark une seule fois dans style.css.
Limite : 5M cellules, 100 requetes/min. Chaque appel relit TOUTES les lignes. Avec 10 fiches/jour = bientot rate-limited.
FIX : Migrer vers Supabase (PostgreSQL) pour transactions, indexes et cache.
Chaque page admin recharge toutes les donnees depuis Google Sheets a chaque visite.
FIX : Ajouter un cache Redis ou localStorage avec TTL de 5 minutes.
email-followup.js et email-sequence.js : si l'envoi echoue, pas de nouvelle tentative. Client ne recoit jamais son suivi.
FIX : Implementer retry avec backoff exponentiel (3 tentatives max).
| Page | Title | Desc | H1 | Schema | Pixel | GA | Stripe | RGPD |
|---|---|---|---|---|---|---|---|---|
| index.html | OK (58) | OK | OK | 3x | Pre-consent | NON | Footer | NON |
| contact.html | 61 chars | OK | OK | 2x | NON | NON | Footer | NON |
| about.html | 74 chars | OK | OK | 1x | NON | NON | NON | NON |
| faq.html | OK (52) | OK | Split | 3x | NON | NON | NON | NON |
| boutique.html | OK | OK | OK | 3x | NON | NON | NON | NON |
| reparation.html | Tronque | OK | OK | 2x | NON | NON | NON | NON |
| reconditionne.html | 68 chars | OK | OK | 1x | NON | NON | NON | NON |
| reparation-cannes | OK (52) | OK | OK | 3x | NON | NON | NON | NON |
| Domaine | Score | Risque principal |
|---|---|---|
| Securite | 25/100 | Credentials en clair, auth client-side, backdoors |
| Admin / Dashboard | 35/100 | Bypass auth, pas de roles, localStorage exploitable |
| Architecture | 40/100 | Google Sheets limite, pas de cache, pas de retry |
| Caisse / Facturation | 45/100 | Ticket Z faux, montants non valides, pas de lien caisse-facture |
| CSS / Design | 50/100 | 3 :root conflictuels, !important, code duplique |
| SEO / Performance | 55/100 | Pas de GA, sitemap incomplet, images shopping feed |
| GLOBAL | 42/100 | Action urgente requise sur la securite |
SCORE APRES CORRECTIONS P0 ESTIMEES : ~70/100 | APRES P0+P1 : ~85/100
Audit realise le 11 avril 2026 — Fone Zone Cannes — fonezone.tech