This commit is contained in:
voxan committed 2026-10-21 22:18:01 +02:00
1 parent 5c43bf9e7c
commit be12cadea6
1 file changed
+62 -31
+62 -31
View File
@@ -4,20 +4,20 @@
-- sur une base vide pour obtenir un environnement pret a l'emploi. -- sur une base vide pour obtenir un environnement pret a l'emploi.
-- --
-- Regroupe et remplace, dans l'ordre : -- Regroupe et remplace, dans l'ordre :
-- 1. schema_v3_with_radio_params.sql (tables de base + donnees Luxembourg) -- 1. schema_v3_with_radio_params.sql (tables de base + donnees Luxembourg)
-- 2. migration_fix_uniq_cell.sql (deja integre : uniq_cell inclut sub_id2 des la creation) -- 2. migration_fix_uniq_cell.sql (deja integre : uniq_cell inclut sub_id2 des la creation)
-- 3. migration_security_hardening.sql / schema_v3_addendum_login_attempts.sql -- 3. migration_security_hardening.sql / schema_v3_addendum_login_attempts.sql
-- (table login_attempts pour le rate limiting de connexion) -- (table login_attempts pour le rate limiting de connexion)
-- --
-- Usage (installation neuve uniquement) : -- Usage (installation neuve uniquement) :
-- mysql -u netmonster_user -p netmonster < install_full_schema.sql -- mysql -u netmonster_user -p netmonster < install_full_schema.sql
-- --
-- Si vous avez DEJA une base existante avec un schema anterieur, -- Si vous avez DEJA une base existante avec un schema anterieur,
-- N'UTILISEZ PAS ce fichier : utilisez plutot, selon votre situation : -- N'UTILISEZ PAS ce fichier : utilisez plutot, selon votre situation :
-- - migration_fix_uniq_cell.sql (si votre contrainte uniq_cell -- - migration_fix_uniq_cell.sql (si votre contrainte uniq_cell
-- ne contient pas encore sub_id2) -- ne contient pas encore sub_id2)
-- - migration_security_hardening.sql (si vous n'avez pas encore la -- - migration_security_hardening.sql (si vous n'avez pas encore la
-- table login_attempts) -- table login_attempts)
-- Ces deux fichiers de migration restent disponibles independamment -- Ces deux fichiers de migration restent disponibles independamment
-- dans ce dossier pour les mises a jour d'une base deja en production, -- dans ce dossier pour les mises a jour d'une base deja en production,
-- sans risque de perte de donnees. -- sans risque de perte de donnees.
@@ -219,18 +219,6 @@ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
-- --------------------------------------------------------------------- -- ---------------------------------------------------------------------
-- 8. RATE LIMITING DE CONNEXION (durcissement securite du 20/09/2026) -- 8. RATE LIMITING DE CONNEXION (durcissement securite du 20/09/2026)
--
-- Compteur d'echecs de connexion stocke en base (et non en session
-- PHP), afin qu'un attaquant ne puisse pas remettre son compteur a
-- zero en vidant ses cookies ou en ouvrant une navigation privee.
-- Utilise par admin/admin_auth.php (is_login_locked_out,
-- record_login_attempt) et admin/login.php.
--
-- Deux seuils appliques cote PHP a partir de cette meme table :
-- - 5 echecs sur le couple (identifiant, IP) en 15 min -> verrouillage cible
-- - 30 echecs sur l'IP seule (tous identifiants confondus) en 15 min
-- -> verrouillage large, plus permissif pour ne pas bloquer tout
-- le monde depuis une IP partagee (ex: sortie Tailscale commune)
-- --------------------------------------------------------------------- -- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS login_attempts ( CREATE TABLE IF NOT EXISTS login_attempts (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
@@ -244,18 +232,61 @@ KEY idx_username_ip_time (username_normalized, ip_address, attempted_at),
KEY idx_ip_time (ip_address, attempted_at) KEY idx_ip_time (ip_address, attempted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Purge recommandee via cron (pas dans ce fichier), pour eviter que -- ---------------------------------------------------------------------
-- la table ne grossisse indefiniment : -- 9. TABLES ADDITIONNELLES (Couches, Backups, Historique d'imports)
-- DELETE FROM login_attempts WHERE attempted_at < NOW() - INTERVAL 30 DAY; -- ---------------------------------------------------------------------
-- Pour admin/map_layers.php
CREATE TABLE IF NOT EXISTS map_layers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
layer_key VARCHAR(50) NOT NULL,
color VARCHAR(7) NOT NULL,
is_visible TINYINT(1) DEFAULT 1,
sort_order INT DEFAULT 0,
description TEXT
) ENGINE=InnoDB;
-- Pour admin/backup.php
CREATE TABLE IF NOT EXISTS backup_log (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
admin_username VARCHAR(100) NOT NULL,
label VARCHAR(255) NOT NULL,
note TEXT,
size_bytes_reported BIGINT
) ENGINE=InnoDB;
-- Pour admin/import_history.php
CREATE TABLE IF NOT EXISTS import_batches (
id INT AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(255) NOT NULL,
imported_at DATETIME DEFAULT CURRENT_TIMESTAMP,
imported_by VARCHAR(100),
status VARCHAR(50),
rows_total INT DEFAULT 0,
rows_imported INT DEFAULT 0,
rows_rejected INT DEFAULT 0,
country_id INT,
FOREIGN KEY (country_id) REFERENCES countries(id)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS import_errors (
id INT AUTO_INCREMENT PRIMARY KEY,
batch_id INT NOT NULL,
line_number INT,
message TEXT,
raw_line TEXT,
FOREIGN KEY (batch_id) REFERENCES import_batches(id) ON DELETE CASCADE
) ENGINE=InnoDB;
-- ===================================================================== -- =====================================================================
-- Fin du schema. A ce stade, la base contient : -- Fin du schema. A ce stade, la base contient :
-- - Luxembourg (MCC 270) + POST/LoL/Tango/Orange pre-configures -- - Luxembourg (MCC 270) + POST/LoL/Tango/Orange pre-configures
-- - Toutes les tables necessaires au fonctionnement complet de -- - Toutes les tables necessaires au fonctionnement complet de
-- l'admin (import .ntm, import CellMapper, validation staging, -- l'admin (import .ntm, import CellMapper, validation staging,
-- edition de sites, export, rate limiting login) -- edition de sites, export, rate limiting login)
-- - AUCUN compte administrateur : creez-en un manuellement, voir -- - AUCUN compte administrateur : creez-en un manuellement, voir
-- INSTALL.md ou INSTALL_TEST_VM.md, section "Creation du compte -- INSTALL.md ou INSTALL_TEST_VM.md, section "Creation du compte
-- administrateur". -- administrateur".
-- ===================================================================== -- =====================================================================