AUDIT COMPLET — FONEZONE.TECH

Date : 11 avril 2026 | Site : fonezone.tech | Dossier : C:\Users\artis\Desktop\FONEZONE
Scope : HTML, CSS, JS, Netlify Functions, Admin, Caisse, SEO, Securite

23
CRITICAL
28
WARNING
18
REFACTOR
42/100
SCORE GLOBAL

1. SECURITE — Score : 25/100

CRITICAL Mot de passe admin "Mnaouar45@" expose en clair

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.

CRITICAL Fichier MEMORY-API-KEYS.md expose sur le serveur

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.

CRITICAL Auth admin 100% cote client (contournable en 2 clics)

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.

CRITICAL Backdoors dans auth.js

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).

CRITICAL Mots de passe employes visibles dans auth.js

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.

CRITICAL API Key unique "Mnaouar45@" pour tous les endpoints

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.

CRITICAL Violation RGPD : Tracking avant consentement

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.

WARNING Pas de rate limiting sur les endpoints POST

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.

WARNING Pas de CSRF tokens sur les formulaires

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.

WARNING XSS possible via champ blog-contenu

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.

2. LOGICIEL DE CAISSE & FACTURATION — Score : 45/100

CRITICAL Ticket Z : Remboursements cassent le calcul du CA

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.

CRITICAL Aucune validation des montants (caisse + facture)

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'].

CRITICAL Mode paiement non reconnu = argent perdu des calculs

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.

CRITICAL Pas de lien entre Caisse et Factures

Impossible de savoir quelle facture correspond a quel paiement en caisse. Audit financier impossible.

FIX : Ajouter un champ "numero_facture" dans chaque ligne caisse.

WARNING Facture.html genere un nouveau numero a chaque appel

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.

WARNING Fidelite : Points illimites sans validation

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.

WARNING Match technicien ignore la disponibilite

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).

3. INTERFACES ADMIN — Score : 35/100

CRITICAL checklist.html et monitoring.html : bypass en 1 ligne
localStorage.setItem('fz_checklist_ok','1'); location.reload(); // Acces total

FIX : Migrer vers FZAuth (auth.js serveur-side) pour toutes les pages admin.

CRITICAL Pas de distinction de roles dans les endpoints

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.

WARNING Donnees stockees en localStorage (exploitable via XSS)

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.

WARNING Manifest.json pointe vers /dashboard.html

Si un visiteur installe la PWA, il arrive directement sur la page admin.

FIX : Changer start_url vers /index.html.

4. SEO & PERFORMANCE — Score : 55/100

CRITICAL Google Analytics ABSENT

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.

CRITICAL Sitemap.xml incomplet (850+ URLs manquantes)

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.

CRITICAL Shopping-feed.xml : meme image pour tous les produits

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).

WARNING Stripe link absent des pages de conversion

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.

WARNING Meta titles trop longs sur 4 pages

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.

WARNING Incoherence numeros telephone/WhatsApp

Tel : +33483441006 vs WhatsApp : 33771267864 — deux numeros differents, confusion pour les clients.

FIX : Standardiser un seul numero ou clarifier (fixe boutique vs mobile WhatsApp).

WARNING Google Fonts charge en synchrone sur 4 pages

contact.html, about.html, reparation-cannes.html, reparation-nice.html — bloque le rendu initial.

FIX : Utiliser le pattern preload+async comme sur index.html.

WARNING Pages villes : contenu "thin" / duplique

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).

5. CSS & DESIGN — Score : 50/100

CRITICAL 3 fichiers :root CSS en conflit

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.

WARNING 8 declarations !important dans fz-design.css

Casse la cascade CSS et rend le code inmaintenable.

FIX : Augmenter la specificite des selecteurs au lieu d'utiliser !important.

WARNING Reset CSS duplique 3 fois

*,*::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.

REFACTOR .btn-dark defini 3 fois dans 3 fichiers

style.css + reconditionne.css + fz-design.css. Le dernier charge ecrase les autres.

FIX : Definir .btn-dark une seule fois dans style.css.

6. ARCHITECTURE — Score : 40/100

WARNING Google Sheets comme base de donnees

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.

WARNING Pas de caching sur les appels API

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.

WARNING Emails sans retry logic

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).

7. MATRICE DE COMPLIANCE — PAGES PRINCIPALES

PageTitleDescH1SchemaPixelGAStripeRGPD
index.htmlOK (58)OKOK3xPre-consentNONFooterNON
contact.html61 charsOKOK2xNONNONFooterNON
about.html74 charsOKOK1xNONNONNONNON
faq.htmlOK (52)OKSplit3xNONNONNONNON
boutique.htmlOKOKOK3xNONNONNONNON
reparation.htmlTronqueOKOK2xNONNONNONNON
reconditionne.html68 charsOKOK1xNONNONNONNON
reparation-cannesOK (52)OKOK3xNONNONNONNON

8. PLAN D'ACTION PAR PRIORITE

P0 — URGENCE (Cette semaine)

  1. SUPPRIMER MEMORY-API-KEYS.md du serveur et revoquer toutes les cles
  2. Changer le mot de passe Mnaouar45@ partout (admin, n8n, API key)
  3. Supprimer les backdoors debug_user et emergency_reset de auth.js
  4. Bloquer tracking avant consentement (Meta Pixel + GA) — risque CNIL
  5. Fixer l'authentification admin : passer en serveur-side JWT sur toutes les pages
  6. Valider les montants dans caisse.js et facturation.js (> 0, numerique, mode_paiement enum)
  7. Corriger le calcul Ticket Z : separer remboursements du CA

P1 — IMPORTANT (Sous 2 semaines)

  1. Ajouter rate limiting sur tous les endpoints POST (10/min/IP)
  2. Implementer CSRF tokens sur les formulaires publics
  3. Installer GA4 avec consentement cookies correct
  4. Regenerer sitemap.xml avec les 850+ URLs
  5. Creer des images uniques pour le shopping-feed.xml
  6. Ajouter CTA Stripe sur boutique, reparation, reconditionne
  7. Fusionner les 3 :root CSS en 1 systeme coherent
  8. Corriger manifest.json (start_url → /index.html)
  9. Ajouter audit trail sur caisse et facturation
  10. Implementer roles (admin/magasin/technicien) dans JWT

P2 — AMELIORATION (Sous 1 mois)

  1. Migrer de Google Sheets vers Supabase (PostgreSQL)
  2. Ajouter contenu unique par page ville (anti duplicate content)
  3. Consolider CSS : style.css + boutique.css → main.css
  4. Supprimer les 8 !important de fz-design.css
  5. Ajouter retry logic sur l'envoi d'emails
  6. Implementer 2FA sur les comptes admin
  7. Verifier disponibilite technicien avant assignation
  8. Lien caisse ↔ facture pour reconciliation

9. RESUME EXECUTIF

DomaineScoreRisque principal
Securite25/100Credentials en clair, auth client-side, backdoors
Admin / Dashboard35/100Bypass auth, pas de roles, localStorage exploitable
Architecture40/100Google Sheets limite, pas de cache, pas de retry
Caisse / Facturation45/100Ticket Z faux, montants non valides, pas de lien caisse-facture
CSS / Design50/1003 :root conflictuels, !important, code duplique
SEO / Performance55/100Pas de GA, sitemap incomplet, images shopping feed
GLOBAL42/100Action 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