doctorlinux commited on
Commit
2c5a1ac
·
verified ·
1 Parent(s): d36b7b1

Upload index.html

Browse files
Files changed (1) hide show
  1. index.html +239 -345
index.html CHANGED
@@ -1,354 +1,248 @@
1
  <!DOCTYPE html>
2
  <html lang="es">
3
  <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Autoevaluación de Ciberseguridad Operativa - Doctor Linux</title>
7
- <style>
8
- body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Inter,Arial,sans-serif;background:#f5f6f5;margin:0;padding:0}
9
- .dlx-wrap{max-width:960px;margin:auto;padding:16px}
10
- .dlx-card{background:#fff;border:1px solid #e6ebef;border-radius:16px;box-shadow:0 6px 24px rgba(0,0,0,.06);padding:22px;margin:14px 0}
11
- .dlx-title{font-size:28px;margin:0 0 4px;color:#214424}
12
- .dlx-sub{color:#5c6b5f;margin-bottom:16px}
13
- .dlx-progress{height:10px;background:#eff4f0;border-radius:999px;overflow:hidden;margin:10px 0 18px}
14
- .dlx-bar{height:100%;width:0;background:#7fbf7f;transition:width .3s}
15
- .dlx-q h4{margin:0 0 6px;font-size:18px}
16
- .dlx-options{display:flex;gap:10px;flex-wrap:wrap;margin:6px 0 12px}
17
- .dlx-pill{border:1px solid #d7e1d9;padding:8px 12px;border-radius:999px;cursor:pointer}
18
- .dlx-pill input{display:none}
19
- .dlx-pill.active{background:#214424;color:#fff;border-color:#214424}
20
- .dlx-nav{display:flex;gap:10px;justify-content:space-between;margin-top:8px}
21
- .dlx-btn{background:#214424;color:#fff;border:none;border-radius:10px;padding:12px 16px;cursor:pointer;transition:all 0.3s}
22
- .dlx-btn:hover{background:#1a361c}
23
- .dlx-btn[disabled]{opacity:.5;cursor:not-allowed}
24
- .dlx-meter{display:grid;grid-template-columns:1fr auto;gap:6px 10px;margin:8px 0}
25
- .dlx-badge{font-weight:600}
26
- .dlx-tag{display:inline-block;background:#eff4f0;border:1px solid #dfe9e2;border-radius:8px;padding:6px 10px;margin:6px 6px 0 0}
27
- .dlx-note{color:#6a786d}
28
- .dlx-score{font-size:40px;font-weight:800;color:#214424}
29
- .dlx-muted{color:#7b8b7f}
30
-
31
- /* Modal Styles */
32
- .modal{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);z-index:1000;justify-content:center;align-items:center}
33
- .modal-content{background:white;padding:30px;border-radius:15px;width:90%;max-width:400px;text-align:center;box-shadow:0 10px 40px rgba(0,0,0,0.2)}
34
- </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  </head>
36
-
37
  <body>
38
- <div class="dlx-wrap" id="dlxApp">
39
- <div class="dlx-card">
40
- <h2 class="dlx-title">Autoevaluación de Ciberseguridad Operativa</h2>
41
- <div class="dlx-sub">Responde con honestidad. Obtendrás tu <b>puntaje</b>, los <b>riesgos clave</b> y un plan sugerido de mejora.</div>
42
- <div class="dlx-progress"><div class="dlx-bar" id="dlxBar"></div></div>
43
- <div class="dlx-note dlx-muted" id="dlxStepNote"></div>
44
- </div>
45
-
46
- <div id="dlxSteps"></div>
47
-
48
- <div class="dlx-card" id="dlxNavBox">
49
- <div class="dlx-nav">
50
- <button class="dlx-btn" id="prevBtn">← Anterior</button>
51
- <button class="dlx-btn" id="nextBtn">Siguiente →</button>
52
- </div>
53
- </div>
54
-
55
- <!-- MODAL PARA CAPTURAR EMAIL -->
56
- <div id="emailModal" class="modal">
57
- <div class="modal-content">
58
- <h3 style="color: #214424; margin-bottom: 15px;">📧 Recibe tu Informe Completo</h3>
59
- <p style="color: #5c6b5f; margin-bottom: 20px;">Ingresa tu email y te enviaremos el análisis detallado a gerencia@doctorlinux.com</p>
60
-
61
- <input type="email" id="userEmail" placeholder="tu.email@empresa.com"
62
- style="width: 100%; padding: 12px; border: 2px solid #e6ebef; border-radius: 8px; margin-bottom: 15px; font-size: 16px;"
63
- onkeypress="if(event.key=='Enter') sendResultsToEmail()">
64
-
65
- <div style="display: flex; gap: 10px; justify-content: center;">
66
- <button onclick="closeEmailModal()"
67
- style="background: #6a786d; color: white; border: none; padding: 12px 20px; border-radius: 8px; cursor: pointer;">
68
- Cancelar
69
- </button>
70
- <button onclick="sendResultsToEmail()"
71
- style="background: #214424; color: white; border: none; padding: 12px 20px; border-radius: 8px; cursor: pointer; font-weight: bold;">
72
- Enviar Informe
73
- </button>
74
- </div>
75
- </div>
76
- </div>
77
-
78
- <div class="dlx-card" id="dlxResult" style="display:none">
79
- <h3 class="dlx-title">Tu diagnóstico</h3>
80
- <div class="dlx-sub">Este resultado es orientativo. Si quieres un informe firmado por ingeniería, solicita el <b>diagnóstico gratuito</b>.</div>
81
- <div style="display:flex;gap:24px;align-items:center;flex-wrap:wrap">
82
- <div>
83
- <div class="dlx-muted">Puntaje global</div>
84
- <div class="dlx-score" id="dlxScore">—%</div>
85
- <div class="dlx-tag" id="dlxLabel">—</div>
86
- </div>
87
- <div style="flex:1;min-width:260px">
88
- <div class="dlx-progress"><div class="dlx-bar" id="dlxBarFinal" style="background:#3aa655"></div></div>
89
- <div class="dlx-note">≈ Mayor a 80%: postura sólida. 60–79%: revisar. Menor a 60%: riesgo elevado.</div>
90
- </div>
91
- </div>
92
-
93
- <div class="dlx-card" style="margin-top:16px">
94
- <h4 style="margin:0 0 8px">Detalle por dominio</h4>
95
- <div id="dlxBreakdown" class="dlx-meter"></div>
96
- </div>
97
-
98
- <div class="dlx-card">
99
- <h4 style="margin:0 0 8px">Recomendaciones inmediatas</h4>
100
- <div id="dlxRecs"></div>
101
- <div class="dlx-note" style="margin-top:8px">Tip: prioriza los dominios con menor puntaje. Podemos ayudarte a cerrar brechas con <b>hardening, firewalls, backups 3-2-1 y monitoreo 24/7</b>.</div>
102
- </div>
103
-
104
- <!-- BOTONES DE ACCIÓN MEJORADOS -->
105
- <div class="dlx-nav" style="margin-top:25px">
106
- <button class="dlx-btn" onclick="window.location.reload()">Refrescar test</button>
107
- <button class="dlx-btn" id="analyzeBtn">🔍 Analizar con IA</button>
108
- <button class="dlx-btn" onclick="openEmailModal()" style="background:#3aa655">📧 Recibir Informe PDF</button>
109
- </div>
110
-
111
- <div id="iaBox" class="dlx-card" style="display:none;margin-top:16px">
112
- <h4>Análisis generado por IA</h4>
113
- <pre id="iaOutput" style="white-space:pre-wrap;"></pre>
114
  </div>
115
- </div>
116
- </div>
117
-
118
- <script>
119
- /* === CONFIGURACIÓN INICIAL === */
120
- const DOMAINS = [
121
- { id:'perimetro', name:'Perímetro / Firewall', qs:[
122
- '¿Usas un firewall dedicado (Mikrotik/OPNsense/etc.) con reglas mínimas por servicio?',
123
- '¿Tienes listas de acceso/geo-bloqueo/IPS/DoS activas?',
124
- '¿Los servicios expuestos están detrás de NAT o Port-Forward controlado?',
125
- '¿Hay políticas VPN de acceso remoto con 2FA?'
126
- ]},
127
- { id:'servers', name:'Servidores / Hardening', qs:[
128
- '¿Cuentas con hardening básico (SSH seguro, usuarios/roles, auditoría)?',
129
- '¿Actualizaciones y parches aplicados regularmente?',
130
- '¿Servicios innecesarios deshabilitados/controlados?'
131
- ]},
132
- { id:'backups', name:'Backups y Recuperación', qs:[
133
- '¿Aplicas la regla 3-2-1 (3 copias, 2 medios, 1 offsite)?',
134
- '¿Pruebas de restauración realizadas en los últimos 6 meses?',
135
- '¿Backups protegidos contra ransomware (inmutables/air-gap)?'
136
- ]},
137
- { id:'monitor', name:'Monitoreo y Alertas', qs:[
138
- '¿Monitoreo centralizado (Zabbix/PRTG/Grafana) con alertas 24/7?',
139
- '¿Métricas revisadas mensualmente?',
140
- '¿Alertas integradas con soporte?'
141
- ]},
142
- { id:'network', name:'Red y Conectividad', qs:[
143
- '¿Segmentación VLANs para aislar servicios críticos?',
144
- '¿Control de ancho de banda/Proxy/filtrado de contenidos?',
145
- '¿Wi-Fi empresarial con WPA2-Enterprise?'
146
- ]},
147
- { id:'endpoints', name:'Usuarios / Estaciones', qs:[
148
- '¿Antimalware/EDR y políticas de actualización?',
149
- '¿Gestión de contraseñas y MFA?',
150
- '¿Políticas de mínimo privilegio + bloqueo de USB?'
151
- ]},
152
- { id:'webmail', name:'Web y Correo', qs:[
153
- '¿Sitios con HTTPS válido y cabeceras seguras?',
154
- '¿Correo con SPF, DKIM y DMARC publicados?',
155
- '¿WAF/antispam/antiphishing activos?'
156
- ]}
157
- ];
158
-
159
- const SCALE = [
160
- {label:'No',score:0},
161
- {label:'Parcial',score:50},
162
- {label:'Sí',score:100},
163
- {label:'No sé',score:null}
164
- ];
165
-
166
- const RECS = {
167
- perimetro:'Endurecer perímetro: reglas mínimo necesario, VPN 2FA, IDS/IPS y protección DoS.',
168
- servers:'Aplicar hardening, cuentas/roles y mantener parches al día.',
169
- backups:'Implementar 3-2-1 con pruebas de restauración y backups inmutables.',
170
- monitor:'Centralizar monitoreo (Zabbix/PRTG) y definir umbrales.',
171
- network:'Segregar VLANs, reforzar proxy y aislar Wi-Fi invitados.',
172
- endpoints:'Mínimo privilegio, EDR/antimalware y MFA.',
173
- webmail:'Forzar HTTPS, cabeceras OWASP, SPF+DKIM+DMARC y WAF.'
174
- };
175
-
176
- let current = 0, answers = {};
177
- const steps = document.getElementById('dlxSteps'),
178
- bar = document.getElementById('dlxBar'),
179
- note = document.getElementById('dlxStepNote'),
180
- prev = document.getElementById('prevBtn'),
181
- next = document.getElementById('nextBtn'),
182
- result = document.getElementById('dlxResult'),
183
- nav = document.getElementById('dlxNavBox');
184
-
185
- /* === FUNCIONES PRINCIPALES === */
186
- function render() {
187
- steps.innerHTML = '';
188
- const d = DOMAINS[current];
189
- note.innerHTML = `<b>${current+1}/${DOMAINS.length}</b> · ${d.name}`;
190
- const card = document.createElement('div');
191
- card.className = 'dlx-card';
192
- card.innerHTML = `<h3 class="dlx-title">${d.name}</h3>`;
193
- d.qs.forEach((q, i) => {
194
- const b = document.createElement('div');
195
- b.className = 'dlx-q';
196
- b.innerHTML = `<h4>${q}</h4>`;
197
- const row = document.createElement('div');
198
- row.className = 'dlx-options';
199
- SCALE.forEach(opt => {
200
- const lbl = document.createElement('label');
201
- lbl.className = 'dlx-pill';
202
- lbl.textContent = opt.label;
203
- lbl.onclick = () => {
204
- row.querySelectorAll('.dlx-pill').forEach(p => p.classList.remove('active'));
205
- lbl.classList.add('active');
206
- if (!answers[d.id]) answers[d.id] = [];
207
- answers[d.id][i] = opt.score;
208
- updateButtons();
209
- };
210
- if (answers[d.id] && answers[d.id][i] === opt.score) lbl.classList.add('active');
211
- row.appendChild(lbl);
212
- });
213
- b.appendChild(row);
214
- card.appendChild(b);
215
- });
216
- steps.appendChild(card);
217
- bar.style.width = Math.round(current / DOMAINS.length * 100) + '%';
218
- updateButtons();
219
- }
220
-
221
- function allAnswered(i) {
222
- const d = DOMAINS[i];
223
- return answers[d.id] && answers[d.id].length === d.qs.length && answers[d.id].every(v => v !== undefined);
224
- }
225
-
226
- function avg(a) {
227
- const nums = a.filter(v => typeof v === 'number' && isFinite(v));
228
- if (nums.length === 0) return 0;
229
- return nums.reduce((x, y) => x + y, 0) / nums.length;
230
- }
231
-
232
- function updateButtons() {
233
- prev.disabled = current === 0;
234
- const last = current === DOMAINS.length - 1;
235
- next.textContent = last ? 'Ver resultado →' : 'Siguiente →';
236
- next.disabled = !allAnswered(current);
237
- }
238
-
239
- prev.onclick = () => { if (current > 0) { current--; render(); } };
240
- next.onclick = () => {
241
- if (current < DOMAINS.length - 1) {
242
- if (!allAnswered(current)) return;
243
- current++; render();
244
- } else {
245
- if (!allAnswered(current)) return;
246
- showResult();
247
- }
248
- };
249
-
250
- function showResult() {
251
- bar.style.width = '100%';
252
- nav.style.display = 'none';
253
- steps.style.display = 'none';
254
- note.style.display = 'none';
255
- result.style.display = 'block';
256
- let weighted = 0, total = 0;
257
- const breakdown = document.getElementById('dlxBreakdown'),
258
- recs = document.getElementById('dlxRecs');
259
- breakdown.innerHTML = '';
260
- recs.innerHTML = '';
261
- DOMAINS.forEach(d => {
262
- const a = answers[d.id] ? avg(answers[d.id]) : 0;
263
- weighted += a; total += 100;
264
- const pct = Math.round(a);
265
- breakdown.innerHTML += `<div>${d.name}</div><div><b>${pct}%</b></div>`;
266
- if (pct < 75) { recs.innerHTML += `<div class="dlx-tag">• ${RECS[d.id]}</div>`; }
267
- });
268
- const global = Math.round(weighted / DOMAINS.length);
269
- document.getElementById('dlxScore').textContent = global + '%';
270
- document.getElementById('dlxBarFinal').style.width = global + '%';
271
- const label = document.getElementById('dlxLabel');
272
- if (global >= 80) { label.textContent = 'Nivel Sólido'; label.style.background = '#e7f7e7'; }
273
- else if (global >= 60) { label.textContent = 'Nivel Medio (revisar)'; label.style.background = '#fff6e1'; }
274
- else { label.textContent = 'Riesgo Alto'; label.style.background = '#ffe9e9'; }
275
-
276
- // Guardar datos para el análisis IA
277
- window.finalData = {
278
- overall: global,
279
- domains: DOMAINS.map(d => ({
280
- name: d.name,
281
- score: Math.round(avg(answers[d.id]))
282
- }))
283
- };
284
- }
285
-
286
- /* === FUNCIONES DE EMAIL === */
287
- function openEmailModal() {
288
- document.getElementById('emailModal').style.display = 'flex';
289
- document.getElementById('userEmail').focus();
290
- }
291
-
292
- function closeEmailModal() {
293
- document.getElementById('emailModal').style.display = 'none';
294
- document.getElementById('userEmail').value = '';
295
- }
296
-
297
- async function sendResultsToEmail() {
298
- const email = document.getElementById('userEmail').value;
299
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
300
-
301
- if (!email || !emailRegex.test(email)) {
302
- alert('⚠️ Por favor ingresa un email válido');
303
- return;
304
- }
305
-
306
- // Simular envío (en producción esto se conectaría a un backend)
307
- const submitBtn = event.target;
308
- const originalText = submitBtn.textContent;
309
- submitBtn.textContent = 'Enviando...';
310
- submitBtn.disabled = true;
311
-
312
- setTimeout(() => {
313
- alert(`✅ Informe enviado correctamente a:\n${email}\n\nTambién se envió copia a: gerencia@doctorlinux.com\n\nRevisa tu bandeja de entrada en los próximos minutos.`);
314
- closeEmailModal();
315
- submitBtn.textContent = originalText;
316
- submitBtn.disabled = false;
317
- }, 2000);
318
- }
319
-
320
- /* === ANÁLISIS CON IA === */
321
- document.getElementById('analyzeBtn').onclick = async function() {
322
- const box = document.getElementById('iaBox');
323
- const out = document.getElementById('iaOutput');
324
- const btn = this;
325
-
326
- box.style.display = 'block';
327
- out.textContent = 'Generando análisis detallado...';
328
- btn.disabled = true;
329
-
330
- try {
331
- const res = await fetch('/analyze', {
332
- method: 'POST',
333
- headers: {'Content-Type': 'application/json'},
334
- body: JSON.stringify(window.finalData)
335
- });
336
-
337
- if (res.ok) {
338
- const data = await res.json();
339
- out.textContent = data.analysis || 'Análisis completado.';
340
- } else {
341
- throw new Error('Error del servidor');
342
- }
343
- } catch (error) {
344
- out.textContent = 'El análisis detallado no está disponible en este momento.\n\nPuntaje: ' + window.finalData.overall + '%\n\nPara un diagnóstico completo, contacta a Doctor Linux.';
345
- } finally {
346
- btn.disabled = false;
347
- }
348
- };
349
 
350
- // Inicializar aplicación
351
- render();
352
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
353
  </body>
354
  </html>
 
1
  <!DOCTYPE html>
2
  <html lang="es">
3
  <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Informe de Seguridad | Descarga Directa</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
13
+ }
14
+
15
+ body {
16
+ background: linear-gradient(135deg, #1a2a6c, #2a3a7c);
17
+ color: #fff;
18
+ min-height: 100vh;
19
+ display: flex;
20
+ flex-direction: column;
21
+ align-items: center;
22
+ justify-content: center;
23
+ padding: 20px;
24
+ }
25
+
26
+ .container {
27
+ max-width: 800px;
28
+ width: 100%;
29
+ background: rgba(255, 255, 255, 0.1);
30
+ backdrop-filter: blur(10px);
31
+ border-radius: 20px;
32
+ padding: 40px;
33
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
34
+ border: 1px solid rgba(255, 255, 255, 0.2);
35
+ }
36
+
37
+ header {
38
+ text-align: center;
39
+ margin-bottom: 30px;
40
+ }
41
+
42
+ .logo {
43
+ font-size: 2.5rem;
44
+ font-weight: 700;
45
+ margin-bottom: 10px;
46
+ color: #4fc3f7;
47
+ }
48
+
49
+ .subtitle {
50
+ font-size: 1.2rem;
51
+ opacity: 0.8;
52
+ margin-bottom: 20px;
53
+ }
54
+
55
+ .content {
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: 30px;
59
+ }
60
+
61
+ .info-section {
62
+ background: rgba(255, 255, 255, 0.05);
63
+ padding: 25px;
64
+ border-radius: 15px;
65
+ border-left: 4px solid #4fc3f7;
66
+ }
67
+
68
+ .info-section h2 {
69
+ margin-bottom: 15px;
70
+ color: #4fc3f7;
71
+ }
72
+
73
+ .info-section ul {
74
+ list-style-type: none;
75
+ padding-left: 10px;
76
+ }
77
+
78
+ .info-section li {
79
+ margin-bottom: 10px;
80
+ padding-left: 25px;
81
+ position: relative;
82
+ }
83
+
84
+ .info-section li:before {
85
+ content: "•";
86
+ color: #4fc3f7;
87
+ font-size: 1.5rem;
88
+ position: absolute;
89
+ left: 0;
90
+ top: -5px;
91
+ }
92
+
93
+ .download-section {
94
+ text-align: center;
95
+ background: rgba(255, 255, 255, 0.05);
96
+ padding: 30px;
97
+ border-radius: 15px;
98
+ }
99
+
100
+ .download-section h2 {
101
+ margin-bottom: 15px;
102
+ color: #4fc3f7;
103
+ }
104
+
105
+ .download-section p {
106
+ margin-bottom: 25px;
107
+ opacity: 0.9;
108
+ font-size: 1.1rem;
109
+ }
110
+
111
+ .download-btn {
112
+ display: inline-block;
113
+ background: linear-gradient(to right, #4fc3f7, #2979ff);
114
+ color: white;
115
+ padding: 15px 40px;
116
+ font-size: 1.2rem;
117
+ font-weight: 600;
118
+ border: none;
119
+ border-radius: 50px;
120
+ cursor: pointer;
121
+ transition: all 0.3s ease;
122
+ text-decoration: none;
123
+ box-shadow: 0 5px 15px rgba(41, 121, 255, 0.4);
124
+ }
125
+
126
+ .download-btn:hover {
127
+ transform: translateY(-3px);
128
+ box-shadow: 0 8px 20px rgba(41, 121, 255, 0.6);
129
+ }
130
+
131
+ .features {
132
+ display: grid;
133
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
134
+ gap: 20px;
135
+ margin-top: 20px;
136
+ }
137
+
138
+ .feature {
139
+ background: rgba(255, 255, 255, 0.05);
140
+ padding: 20px;
141
+ border-radius: 10px;
142
+ text-align: center;
143
+ }
144
+
145
+ .feature-icon {
146
+ font-size: 2.5rem;
147
+ margin-bottom: 10px;
148
+ color: #4fc3f7;
149
+ }
150
+
151
+ footer {
152
+ margin-top: 40px;
153
+ text-align: center;
154
+ font-size: 0.9rem;
155
+ opacity: 0.7;
156
+ }
157
+
158
+ @media (max-width: 600px) {
159
+ .container {
160
+ padding: 25px;
161
+ }
162
+
163
+ .logo {
164
+ font-size: 2rem;
165
+ }
166
+
167
+ .download-btn {
168
+ padding: 12px 30px;
169
+ font-size: 1.1rem;
170
+ }
171
+ }
172
+ </style>
173
  </head>
 
174
  <body>
175
+ <div class="container">
176
+ <header>
177
+ <div class="logo">DoctorLinux</div>
178
+ <div class="subtitle">Soluciones de Seguridad Informática</div>
179
+ </header>
180
+
181
+ <div class="content">
182
+ <div class="info-section">
183
+ <h2>Análisis de Seguridad Completado</h2>
184
+ <p>Hemos finalizado la evaluación de seguridad de tu infraestructura. El informe incluye:</p>
185
+ <ul>
186
+ <li>Evaluación de roles NAS y gestión de parches</li>
187
+ <li>Análisis de configuración de firewalls</li>
188
+ <li>Verificación de estrategia de backups 3-2-1</li>
189
+ <li>Revisión de políticas de acceso y MFA</li>
190
+ <li>Recomendaciones de hardening</li>
191
+ </ul>
192
+ </div>
193
+
194
+ <div class="download-section">
195
+ <h2>Descarga tu Informe Completo</h2>
196
+ <p>Obtén tu análisis detallado en PDF al instante</p>
197
+ <a href="#" class="download-btn" id="downloadBtn">Descargar PDF</a>
198
+
199
+ <div class="features">
200
+ <div class="feature">
201
+ <div class="feature-icon">📊</div>
202
+ <div>Análisis Detallado</div>
203
+ </div>
204
+ <div class="feature">
205
+ <div class="feature-icon">🔒</div>
206
+ <div>Evaluación de Seguridad</div>
207
+ </div>
208
+ <div class="feature">
209
+ <div class="feature-icon">⚡</div>
210
+ <div>Descarga Inmediata</div>
211
+ </div>
212
+ </div>
213
+ </div>
214
+ </div>
215
+
216
+ <footer>
217
+ <p>© 2023 DoctorLinux. Todos los derechos reservados.</p>
218
+ </footer>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
 
221
+ <script>
222
+ document.getElementById('downloadBtn').addEventListener('click', function(e) {
223
+ e.preventDefault();
224
+
225
+ // Simulación de descarga
226
+ const btn = this;
227
+ const originalText = btn.textContent;
228
+
229
+ btn.textContent = 'Preparando descarga...';
230
+ btn.style.opacity = '0.7';
231
+
232
+ setTimeout(function() {
233
+ btn.textContent = '¡Descarga completada!';
234
+ btn.style.background = 'linear-gradient(to right, #4CAF50, #2E7D32)';
235
+
236
+ setTimeout(function() {
237
+ btn.textContent = originalText;
238
+ btn.style.opacity = '1';
239
+ btn.style.background = 'linear-gradient(to right, #4fc3f7, #2979ff)';
240
+
241
+ // Aquí iría la lógica real de descarga
242
+ alert('En una implementación real, el PDF se descargaría ahora.');
243
+ }, 2000);
244
+ }, 1500);
245
+ });
246
+ </script>
247
  </body>
248
  </html>