Sécurité
Cette page décrit le modèle de sécurité de WebBlocks CMS et les étapes qu'un opérateur doit suivre. ou l'agence devrait prendre pour l'exécuter en toute sécurité pour les sites clients. Pour savoir comment signaler un vulnérabilité, voir SECURITY.md — veuillez ne pas l'ouvrir en public problèmes liés aux rapports de sécurité.
Renforcement du déploiement
Voici les contrôles les plus importants pour une installation de production :
- Servez uniquement
public/comme racine Web. La racine de l'application contient.env,.git,.github,storage/,vendor/et le code source qui doit ne jamais être accessible sur le Web. Pointez la racine de votre document Nginx/Apache verspublic/et confirmez quehttps://your-site/.git/configethttps://your-site/.envrenvoient tous deux 404. Un répertoire.gitexposé fuit votre source complète et tous les secrets commis. - Préférez un artefact de version à un clone Git brut en production. Release
les packages excluent
.git,.github,project/et d'autres fichiers non-exécutables (voir les règles.gitattributesexport-ignore). Si vous déployez un clone, désactivez appuyez sur l'installation (git remote set-url --push origin DISABLED). - Set
APP_DEBUG=falseet unAPP_KEYfort en production. Mode débogage fuites de traces de pile, de valeurs d'environnement et de chemins internes. - Utilisez HTTPS et définissez
SESSION_SECURE_COOKIE=truelors de la diffusion via TLS. - Autorisations de fichier : l'utilisateur Web/PHP a besoin de lecture/écriture sur
storage/et le Racine du disquebackups(storage/app/backupspar défaut). not utilise-t-il777? accordez plutôt la propriété ou l'accès au groupe. - Conserver les secrets dans
.env..env,.env.*(sauf.env.example) et Lesauth.jsonsont ignorés par Git. Les jetons d'API CMS et les mots de passe de messagerie ne sont jamais écrit dans le référentiel.
Authentification et autorisation
- L'authentification CMS est native Laravel (aucune exigence Breeze/Jetstream/Fortify). Administrateurs
connectez-vous à
/webadmin/login; les mots de passe sont hachés par bcrypt. - Accès à trois rôles d'installation :
super_admin(à l'échelle de l'installation),site_admin(sites attribués) eteditor(contenu brouillon dans les sites attribués). Intersite les actions (déplacement/duplication, Shared Slots) imposent l'accès à la fois à la source et à la cible sites. Voir Utilisateurs et autorisations. - L'arborescence d'administration
/webadminest protégée par le CMS web + auth + admin-access pile de middleware. Les routes publiques ne restituent jamais de contenu brouillon ; brouillon/aperçu l'accès nécessite un administrateur authentifié ou un jeton de confiance aveccontent.read. - Les demandes de connexion et de réinitialisation du mot de passe sont limitées. Les échecs de connexion sont
limité par e-mail + IP (par défaut 5 tentatives, puis un court verrouillage qu'un
la connexion réussie est effacée ; régler avec
WEBBLOCKS_CMS_MAX_LOGIN_ATTEMPTSetWEBBLOCKS_CMS_LOGIN_DECAY_SECONDS). Un backstop par IP plafonne en outre le points de terminaison de connexion, de mot de passe oublié et de réinitialisation de mot de passe contre les inondations et tentatives de rotation d'e-mails.
Jetons Internal Content API
Le Internal Content API (/webadmin/api) est destiné aux outils d'opérateur/IA de confiance.
- Les jetons personnels sont créés par tout utilisateur CMS actif à partir de Profile → Personnel
Jetons API ; Les jetons système au niveau de l'installation sont créés par un
super_adminà partir de Système → Jetons API. Les deux sont stockés sous forme de hachages et affichés en clair envoyer un message une seule fois. - Chaque jeton comporte des capacités explicites (lecture, publication, média, plug-in cycle de vie, commerce, …) Les capacités avancées/destructrices sont des opt-ins distincts ; les capacités normales de création de pages sont la valeur par défaut.
- Les jetons peuvent être revoked (en conservant la ligne d'audit) ou supprimés. Un par jeton Le journal d'activité enregistre l'heure, la méthode/le chemin, l'itinéraire, le résultat de la capacité, l'adresse IP et un résumé de l'agent utilisateur - mais ne demandez jamais de corps, de chaînes de requête, de réponses ou valeurs des jetons.
- Traitez les jetons API comme des secrets. Étendez-les aux capacités minimales d'un outil besoins et faites-les pivoter s’ils sont exposés.
- Les jetons d'API personnels croisent en permanence des fonctionnalités et des sites sélectionnés avec le rôle réel de leur propriétaire, l'état actif, les affectations de site et la page autorité de flux de travail. Les opérations au niveau de l’installation restent uniquement au niveau du jeton système.
- Les jetons API personnels peuvent être limités aux adresses IPv4/IPv6 exactes ou CIDR réseaux et comportent un plafond de demande par minute spécifique au jeton. Ces contrôles sont appliquées en plus de l'accès en direct aux utilisateurs, aux sites, aux flux de travail et aux fonctionnalités.
- Les itinéraires canoniques
/webadmin/apiet l'ancien/admin-apiles routes de compatibilité partagent le limiteur de débit Internal Content API.
Lorsqu'un proxy inverse ou un CDN est présent, configurez Laravel pour faire confiance uniquement au adresses proxy réelles et vérifiez l'adresse IP du client résolue avant d'activer un liste verte. N’acceptez jamais d’en-têtes transmis directement depuis Internet.
Mise à jour de la sécurité
Les mises à jour du système dans l'application remplacent le code du package CMS dans
vendor/fklavyenet/webblocks-cms sur le site en direct. Parce qu'une mise à jour exécute de nouveaux
code, l'intégrité du package téléchargé est une exécution de code à distance
limite. WebBlocks CMS atténue ce problème comme suit :
- Somme de contrôle SHA-256 obligatoire. Le programme de mise à jour télécharge le ZIP de la version, puis
vérifie
hash_file('sha256', …)par rapport auchecksum_sha256fourni par le publier les métadonnées à l’aide d’unhash_equalssécurisé. Si la somme de contrôle est manquante ou ne correspond pas, la mise à jour est refused — elle ne revient pas à application d'un package non vérifié. - Service de mise à jour canonique. Les métadonnées de mise à jour et les téléchargements proviennent de
publisher.webblocksui.com. Parce que la somme de contrôle est livrée avec le téléchargé par le même service, la somme de contrôle protège contre les fichiers corrompus ou artifacts falsifié, mais pas contre un service de mise à jour entièrement compromis. - Les installations sont des consommateurs et non des éditeurs. Les sites installés récupèrent les mises à jour, mais
ne doit pas être poussé vers le référentiel en amont. La publication se fait uniquement à partir du
contrôle de maintenance avec un
WEBBLOCKS_PUBLISHER_TOKEN.
Vérification de signature (Ed25519)
Pour une défense en profondeur contre un service de mise à jour compromis — où la somme de contrôle
voyage aux côtés de l'artefact - les versions peuvent être signées cryptographiquement .
L'éditeur signe la somme de contrôle de la version avec une clé secrète Ed25519 et installe
vérifier la signature par rapport à une clé publique épinglée (sodium_crypto_sign), donc un
l'installation rejette toute version non signée par la vraie clé.
Pour l'activer :
- Générer une seule fois une bi-clé, sur la machine de maintenance/éditeur :
php artisan webblocks:updates:keygen. - Gardez le
WEBBLOCKS_PUBLISHER_SIGNING_KEYimprimé (secret) privé — définissez-le uniquement là où vous publiez des versions. Ne le validez jamais et ne le configurez jamais sur une installation. - Épinglez la clé publique imprimée pour que les installations vérifient les versions signées : définissez
WEBBLOCKS_UPDATE_PUBLIC_KEY, ou définissezReleaseDefaults::UPDATE_PUBLIC_KEYde manière à la clé est livrée dans le code CMS (recommandé : une clé épinglée par un code ne peut pas être échangé via un.envcompromis). - Publiez comme d'habitude ; l'éditeur signe automatiquement chaque version.
Rollout est sécurisé : même si aucune clé publique n'est épinglée, la vérification de la signature ne l'est pas appliquée (la vérification de la somme de contrôle s'applique toujours). Une fois qu'une clé publique est épinglée et les installations reçoivent ce code, chaque version future doit comporter un Ed25519 valide signature sur sa somme de contrôle, ou la mise à jour est refusée.
Sécurité du contenu et de la saisie
- Formulaires publicspartager un pipeline de protection local : preuve signée sous forme,
pots de miel générés, timing, score de contenu/répétition, expéditeur et source saisis
compteurs,
/24ou/64la pression du réseau et les empreintes digitales apprises localement sur le site. Il ne fait aucune demande externe. Les compteurs de protection utilisent des hachages à clé ; mesures quotidiennes contiennent uniquement des décisions globales. VoirSoumission publique Protection. - Formulaires de contactstocker les soumissions notées pour examen. Quarantaine et suppression du spam notification tout en restant séparé de l’historique de livraison des notifications. VoirFormulaires de contact et messages.
- Commentairespar défaut
pending; une décision de spam est conservée comme spam et jamais apparaît publiquement sans modération. - HTML de confianceest limité au balisage de mise en page adjacent au wrapper et ne doit pas être utilisé pour injecter des scripts ; préférer les contrats de bloc natifs, que l'Interne L'API de contenu valide le brouillon en premier.
- Les téléchargements de médias sont limités à une liste blanche d'images, de vidéos et de documents.
genres(contenu détecté, non approuvé par l'extension).Les téléchargements SVG sont désactivés
par défaut, car un SVG peut contenir un script en ligne et le média est servi à partir de
la même origine que l'administrateur. Activez-le uniquement sur les installations où chaque compte
qui peut télécharger des médias est fiable, via
WEBBLOCKS_CMS_ALLOW_SVG_UPLOADS=true. La même liste verte régit les récupérations de médias distants côté serveur. - La récupération multimédia à distance valide chaque cible de redirection et épingle le HTTP connexion à l’adresse IP publique qui a réussi la validation.Cela ferme le Course de recherche/connexion DNS utilisée par les attaques de rereliure DNS. Récupération à distance échoue la fermeture lorsque l’épinglage d’adresse cURL PHP n’est pas disponible.
- Les iframes d’applications intégrées gérées sont des bacs à sable d’origine opaque.Leur
les réponses d’entrée appliquent des en-têtes CSP et référents restrictifs. CSP nomme le
l'origine du site actuellement enregistré explicitement afin que les documents d'origine opaque puissent se charger
leurs scripts, styles, médias et
<base>URL sans accorder le accès iframe de même origine aux cookies du CMS, au stockage, à la page parent ou demandes de panel authentifiées. - Les packages d’applications intégrées complètes restent isolés.Immuable,
les fichiers de package versionnés sont servis via une route publique réservée aux applications
avec CORS anonyme et en-têtes de ressources d'origine croisée, permettant une origine opaque
jeux pour charger des images, de l'audio, des polices, des fichiers JSON et des fichiers régionaux sans accorder
allow-same-origin. L'installation ZIP rejette les traversées, les chemins en double, fichiers de serveur exécutables et violations de nombre limité ou de taille étendue.
Télémétrie et confidentialité
- Les vérifications de mise à jour peuvent envoyer à l'éditeur des données de télémétrie d'adoption préservant la confidentialité :
uniquement
product_key,installed_version,channel, un caractère aléatoire persistant localementinstallation_idettelemetry_schema_version. Aucun domaine, URL, administrateur e-mails, chemins, détails de la base de données, nombre d'utilisateurs, jetons ou environnement/configuration arbitraire les valeurs sont envoyées. DéfinissezWEBBLOCKS_TELEMETRY=falsepour vous désinscrire ; vérifications des métadonnées continuer sans ID d'installation. - Les rapports de visiteurs conservent les enregistrements de pages vues avec le chemin, l'heure et le référent normalisé. hôte, valeurs UTM, catégorie d’appareil et classification des robots. Complet basé sur le consentement le suivi peut également conserver une clé de session et une adresse IP HMAC ; ce sont des pseudonymes identifiants, pas une garantie d’anonymat. Nouveaux graphiques et modaux de détails de page n’introduisez aucun identifiant supplémentaire ni script de suivi public. Programmé la rétention remplace les détails expirés par des décomptes quotidiens de sites/locales et plus tard expire ces comptes. Voir OOpérations.
Signaler une vulnérabilité
Rapport privé via les avis de sécurité GitHub ou le contact du responsable dans SÉCURITÉ.md. Nous visons à accuser réception des rapports dans les 5 entreprises jours et coordonnera avec vous un calendrier de divulgation.
Démarrage et récupération du plug-in (1.94.0–1.94.2)
CMS valident le candidat dans un processus PHP distinct avant l'activation en mode d'exécution normal. Une source invalide, des échecs de fournisseur/route, des sorties anticipées et des délais d'attente le rejettent ; une mise à jour rejetée conserve le package de travail. Les échecs de configuration de la base de données maintiennent le plugin désactivé et préservent ses données. Les échecs de source d'exécution ou de route mettent en quarantaine le plugin concerné et suppriment les routes partiellement enregistrées.
L'écran /webadmin/plugin-recovery et le chargement de la connexion sans source de plugin installée. CMS 1.94.2 applique l'accès administrateur du compte actif et l'autorisation Super admin, y compris les sessions existantes. La récupération peut désactiver le plugin défaillant ou restaurer le package précédent conservé uniquement lorsqu'aucune migration de base de données n'a été exécutée ; la restauration répète la validation de démarrage et republie les ressources précédentes. Les contrôles de connexion normaux et la protection CSRF restent en vigueur. Cela protège le chemin de récupération du plug-in géré, et non les fournisseurs d'hébergement arbitraires ou l'isolation PHP de l'exécutable. Voir Plugin System.
Autorité API des mises à jour du système (1.90.0)
Les mises à jour d'installation nécessitent un jeton système à l'échelle de l'installation appartenant à un utilisateur actif ayant accès au système. system-updates.read et system-updates.run sont des opt-ins distincts ; ni les jetons personnels ni les jetons à l'échelle du site ne peuvent les utiliser. L'exécution nécessite l'approbation explicite de la version installée, de la version cible et de la somme de contrôle, avec un reçu d'idempotence durable pour les réponses incertaines. Voir les mises à jour .