- Suppression de /app/api/pdf-proxy/route.ts (endpoint inutilisé avec CORS *) - Suppression de /app/api/pdf-clean/route.ts (endpoint inutilisé avec CORS *) - Mise à jour du rapport d'audit de sécurité - Les PDFs sont désormais affichés via URLs présignées S3 directes
75 lines
2.5 KiB
SQL
75 lines
2.5 KiB
SQL
-- Migration : Table pour les rapports CSP
|
|
-- Date : 14 novembre 2025
|
|
-- Description : Stockage des violations CSP pour analyse de sécurité
|
|
|
|
-- Table principale pour les rapports CSP
|
|
CREATE TABLE IF NOT EXISTS csp_reports (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
document_uri TEXT NOT NULL,
|
|
violated_directive TEXT NOT NULL,
|
|
effective_directive TEXT,
|
|
blocked_uri TEXT,
|
|
source_file TEXT,
|
|
line_number INTEGER,
|
|
column_number INTEGER,
|
|
status_code INTEGER,
|
|
user_agent TEXT,
|
|
referrer TEXT,
|
|
original_policy TEXT,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- Index pour les requêtes fréquentes
|
|
CREATE INDEX idx_csp_reports_created_at ON csp_reports(created_at DESC);
|
|
CREATE INDEX idx_csp_reports_directive ON csp_reports(violated_directive);
|
|
CREATE INDEX idx_csp_reports_blocked_uri ON csp_reports(blocked_uri);
|
|
CREATE INDEX idx_csp_reports_document_uri ON csp_reports(document_uri);
|
|
|
|
-- Table pour tracker les emails envoyés (éviter les doublons)
|
|
CREATE TABLE IF NOT EXISTS csp_email_logs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
report_date DATE NOT NULL UNIQUE,
|
|
reports_count INTEGER NOT NULL DEFAULT 0,
|
|
unique_violations INTEGER NOT NULL DEFAULT 0,
|
|
email_sent_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
-- Activer RLS (même si non utilisé pour l'instant)
|
|
ALTER TABLE csp_reports ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE csp_email_logs ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- Politique pour permettre l'insertion via service role
|
|
CREATE POLICY "Service role can insert reports" ON csp_reports
|
|
FOR INSERT
|
|
WITH CHECK (true);
|
|
|
|
CREATE POLICY "Staff can view reports" ON csp_reports
|
|
FOR SELECT
|
|
USING (
|
|
EXISTS (
|
|
SELECT 1 FROM staff_users
|
|
WHERE staff_users.user_id = auth.uid()
|
|
AND staff_users.is_staff = true
|
|
)
|
|
);
|
|
|
|
-- Vue pour les statistiques
|
|
CREATE OR REPLACE VIEW csp_reports_summary AS
|
|
SELECT
|
|
violated_directive,
|
|
COUNT(*) as violation_count,
|
|
COUNT(DISTINCT blocked_uri) as unique_blocked_uris,
|
|
COUNT(DISTINCT document_uri) as affected_pages,
|
|
MAX(created_at) as last_occurrence
|
|
FROM csp_reports
|
|
WHERE created_at > NOW() - INTERVAL '7 days'
|
|
GROUP BY violated_directive
|
|
ORDER BY violation_count DESC;
|
|
|
|
-- Grant permissions
|
|
GRANT SELECT ON csp_reports_summary TO authenticated;
|
|
|
|
-- Commentaires
|
|
COMMENT ON TABLE csp_reports IS 'Stockage des violations CSP (Content Security Policy) pour analyse de sécurité';
|
|
COMMENT ON TABLE csp_email_logs IS 'Log des emails quotidiens envoyés avec rapports CSP';
|
|
COMMENT ON VIEW csp_reports_summary IS 'Vue résumée des violations CSP des 7 derniers jours';
|