Help
RSS
API
Feed
Maltego
Contact
Domain > iorecu.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-03-26
88.223.87.229
(
ClassC
)
2025-03-28
145.223.124.181
(
ClassC
)
2025-04-06
147.79.79.90
(
ClassC
)
2025-04-14
147.79.79.132
(
ClassC
)
2025-04-14
88.223.87.172
(
ClassC
)
2025-04-14
88.223.87.123
(
ClassC
)
2025-04-21
88.223.87.78
(
ClassC
)
2025-04-23
88.223.87.29
(
ClassC
)
2025-04-24
147.79.79.12
(
ClassC
)
2025-04-26
145.223.124.44
(
ClassC
)
2025-04-28
147.79.72.243
(
ClassC
)
2025-05-03
147.79.79.235
(
ClassC
)
2025-05-05
88.223.87.135
(
ClassC
)
2025-05-06
88.223.87.201
(
ClassC
)
2025-05-09
88.223.87.2
(
ClassC
)
2025-05-17
147.79.79.231
(
ClassC
)
2025-05-17
147.79.72.222
(
ClassC
)
2025-05-23
145.223.124.182
(
ClassC
)
2025-05-25
147.79.72.169
(
ClassC
)
2025-05-26
88.223.87.169
(
ClassC
)
2025-05-30
147.79.72.15
(
ClassC
)
2025-06-01
145.223.124.246
(
ClassC
)
2025-06-02
147.79.79.58
(
ClassC
)
2025-06-03
147.79.79.34
(
ClassC
)
2025-06-05
145.223.124.174
(
ClassC
)
2025-06-08
147.79.79.218
(
ClassC
)
2025-06-09
147.79.72.199
(
ClassC
)
2025-06-10
145.223.124.237
(
ClassC
)
2025-06-11
147.79.79.35
(
ClassC
)
2025-06-16
147.79.72.244
(
ClassC
)
2025-06-16
147.79.79.72
(
ClassC
)
2025-06-20
145.223.124.195
(
ClassC
)
2025-06-21
147.79.79.66
(
ClassC
)
2025-06-22
88.223.87.118
(
ClassC
)
2025-06-22
147.79.72.193
(
ClassC
)
2025-06-24
88.223.87.64
(
ClassC
)
2025-06-24
147.79.79.6
(
ClassC
)
2025-06-27
145.223.124.89
(
ClassC
)
2025-07-05
88.223.87.54
(
ClassC
)
2025-07-05
147.79.72.228
(
ClassC
)
2025-07-10
147.79.79.246
(
ClassC
)
2025-07-10
88.223.87.120
(
ClassC
)
2025-07-12
147.79.72.121
(
ClassC
)
2025-07-12
147.79.79.196
(
ClassC
)
2025-07-14
147.79.72.230
(
ClassC
)
2025-07-18
147.79.72.168
(
ClassC
)
2025-07-23
147.79.72.150
(
ClassC
)
2025-07-23
145.223.124.69
(
ClassC
)
2025-07-24
88.223.87.46
(
ClassC
)
2025-07-25
145.223.124.201
(
ClassC
)
2025-07-28
88.223.87.91
(
ClassC
)
2025-07-29
145.223.124.146
(
ClassC
)
2025-08-01
147.79.79.85
(
ClassC
)
2025-08-06
88.223.87.183
(
ClassC
)
2025-08-07
147.79.72.33
(
ClassC
)
2025-08-07
147.79.79.86
(
ClassC
)
2025-08-08
147.79.72.212
(
ClassC
)
2025-08-09
145.223.124.248
(
ClassC
)
2025-08-10
147.79.79.114
(
ClassC
)
2025-08-14
147.79.79.123
(
ClassC
)
2025-08-14
147.79.72.30
(
ClassC
)
2025-08-16
147.79.79.140
(
ClassC
)
2025-08-16
88.223.87.175
(
ClassC
)
2025-08-17
88.223.87.6
(
ClassC
)
2025-08-18
145.223.124.30
(
ClassC
)
2025-08-21
147.79.72.63
(
ClassC
)
2025-08-22
147.79.79.185
(
ClassC
)
2025-08-26
145.223.124.85
(
ClassC
)
2025-08-26
147.79.72.96
(
ClassC
)
2025-08-27
147.79.72.186
(
ClassC
)
2025-08-28
88.223.87.53
(
ClassC
)
2025-08-29
147.79.79.16
(
ClassC
)
2025-08-30
147.79.72.132
(
ClassC
)
2025-08-30
88.223.87.41
(
ClassC
)
2025-09-06
145.223.124.17
(
ClassC
)
2025-09-06
147.79.72.24
(
ClassC
)
2025-09-06
88.223.87.71
(
ClassC
)
2025-09-08
88.223.87.26
(
ClassC
)
2025-09-08
145.223.124.180
(
ClassC
)
2025-09-08
147.79.72.140
(
ClassC
)
2025-09-13
147.79.72.123
(
ClassC
)
2025-09-13
145.223.124.41
(
ClassC
)
2025-09-20
147.79.72.153
(
ClassC
)
2025-09-25
147.79.72.218
(
ClassC
)
2025-09-26
145.223.124.107
(
ClassC
)
2025-09-26
147.79.72.115
(
ClassC
)
2025-10-27
91.108.98.64
(
ClassC
)
2025-10-27
93.127.179.123
(
ClassC
)
2025-10-28
147.79.79.109
(
ClassC
)
2025-10-28
147.79.72.176
(
ClassC
)
2025-10-28
147.79.72.40
(
ClassC
)
2025-10-28
92.113.16.43
(
ClassC
)
2025-10-28
92.113.23.60
(
ClassC
)
2025-10-29
92.113.23.42
(
ClassC
)
2025-10-29
92.113.16.93
(
ClassC
)
2025-11-03
147.79.79.181
(
ClassC
)
2025-11-03
147.79.72.57
(
ClassC
)
2025-11-10
145.223.124.171
(
ClassC
)
2025-11-10
147.79.79.149
(
ClassC
)
2025-11-11
88.223.87.105
(
ClassC
)
2025-11-11
145.223.124.60
(
ClassC
)
2025-11-11
147.79.79.39
(
ClassC
)
2025-11-11
145.223.124.169
(
ClassC
)
2025-11-18
147.79.72.174
(
ClassC
)
2025-11-18
147.79.79.96
(
ClassC
)
2025-11-18
88.223.87.170
(
ClassC
)
2025-11-18
88.223.87.43
(
ClassC
)
2025-11-25
92.113.16.113
(
ClassC
)
2025-11-25
88.223.87.244
(
ClassC
)
2025-11-25
92.113.23.234
(
ClassC
)
2025-11-25
77.37.76.202
(
ClassC
)
2025-11-25
148.135.128.0
(
ClassC
)
2025-11-25
147.79.120.125
(
ClassC
)
2025-11-25
92.112.198.247
(
ClassC
)
2025-11-25
147.79.79.169
(
ClassC
)
2025-12-02
147.79.119.78
(
ClassC
)
2025-12-02
147.79.79.81
(
ClassC
)
2025-12-02
88.223.87.239
(
ClassC
)
2025-12-02
147.79.116.169
(
ClassC
)
2025-12-08
84.32.84.240
(
ClassC
)
2025-12-11
212.1.212.223
(
ClassC
)
2025-12-11
77.37.76.205
(
ClassC
)
2025-12-11
148.135.128.236
(
ClassC
)
2025-12-11
191.101.104.197
(
ClassC
)
2025-12-30
145.223.124.148
(
ClassC
)
2025-12-30
147.79.72.106
(
ClassC
)
2026-01-01
92.113.16.241
(
ClassC
)
2026-01-01
92.113.23.138
(
ClassC
)
2026-01-02
91.108.98.148
(
ClassC
)
2026-01-04
77.37.53.70
(
ClassC
)
2026-01-04
77.37.83.248
(
ClassC
)
2026-01-06
77.37.83.234
(
ClassC
)
2026-01-09
77.37.53.20
(
ClassC
)
2026-01-09
93.127.179.228
(
ClassC
)
2026-01-10
93.127.179.227
(
ClassC
)
2026-01-10
77.37.53.5
(
ClassC
)
2026-01-14
93.127.179.24
(
ClassC
)
2026-01-14
77.37.83.142
(
ClassC
)
2026-01-16
91.108.98.244
(
ClassC
)
2026-01-18
77.37.83.227
(
ClassC
)
2026-01-18
93.127.179.201
(
ClassC
)
2026-01-24
91.108.98.255
(
ClassC
)
2026-01-24
77.37.83.62
(
ClassC
)
2026-01-25
77.37.53.248
(
ClassC
)
2026-01-25
93.127.179.51
(
ClassC
)
2026-01-30
93.127.179.97
(
ClassC
)
2026-02-13
148.135.128.139
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyDate: Fri, 13 Feb 2026 09:57:08 GMTContent-Type: text/htmlContent-Length: 795Connection: keep-aliveLocation: https://iorecu.com/platform: hostingerpanel: hpanelContent-Security-Policy: upgrade-insecure-requestsServer: hcdnalt-svc: h3:443; ma86400x-hcdn-request-id: 2fd681cea7c7bb0d375d54526fb791db-phx-edge6x-hcdn-cache-status: MISSx-hcdn-upstream-rt: 0.004 !DOCTYPE html>html styleheight:100%>head>meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno />title> 301 Moved Permanently/title>style>@media (prefers-color-scheme:dark){body{background-color:#000!important}}/style>/head>body stylecolor: #444; margin:0;font: normal 14px/20px Arial, Helvetica, sans-serif; height:100%; background-color: #fff;>div styleheight:auto; min-height:100%; > div styletext-align: center; width:800px; margin-left: -400px; position:absolute; top: 30%; left:50%;> h1 stylemargin:0; font-size:150px; line-height:150px; font-weight:bold;>301/h1>h2 stylemargin-top:20px;font-size: 30px;>Moved Permanently/h2>p>The document has been permanently moved./p>/div>/div>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Fri, 13 Feb 2026 09:57:08 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveVary: Accept-EncodingLast-Modified: Sun, 18 Jan 2026 19:40:46 GMTEtag: W/f159-696d373e-e11b6be0fa80f889;gzplatform: hostingerpanel: hpanelContent-Security-Policy: upgrade-insecure-requestsServer: hcdnalt-svc: h3:443; ma86400x-hcdn-request-id: 3e9ee1802baa11b7073b883ebf01ec46-phx-edge5x-hcdn-cache-status: DYNAMICx-hcdn-upstream-rt: 0.013 !DOCTYPE html>html langes>head> meta charsetUTF-8> !-- Meta viewport optimizado para evitar problemas de escalado en móviles --> meta nameviewport contentwidthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno, shrink-to-fitno> title>Integridad Operacional de Riesgos/title> link relicon hreffavicon.png typeimage/png> link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css> style> :root { /* Paleta de colores moderna con azul marino oscuro */ --primary-color: #1a2a42; /* Azul marino oscuro como en la imagen */ --primary-dark: #152138; /* Versión más oscura */ --primary-light: #e6e9f0; /* Versión más clara */ --secondary-color: #2E3B4E; --dark-bg: #1a2a42; /* Mismo azul marino oscuro */ --light-bg: #F7F9FC; --card-bg: #FFFFFF; --card-hover: #F0F7FF; --text-primary: #2E3B4E; --text-secondary: #6B7A90; --text-light: #FFFFFF; --success-color: #00C853; --waiting-color: #FF9800; --error-color: #F44336; --border-color: #E0E7EF; /* Espaciado y dimensiones */ --border-radius: 8px; --border-radius-sm: 4px; --spacing-xs: 4px; --spacing-sm: 8px; --spacing-md: 16px; --spacing-lg: 24px; --spacing-xl: 32px; /* Sombras */ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08); --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12); /* Transiciones */ --transition-fast: all 0.2s ease; --transition-normal: all 0.3s ease; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: Segoe UI, Roboto, sans-serif; } body { background-color: var(--light-bg); color: var(--text-primary); min-height: 100vh; position: relative; overflow-x: hidden; } a { text-decoration: none; color: inherit; } /* Header principal */ .main-header { background: var(--primary-color); /* Color sólido azul marino oscuro */ color: var(--text-light); padding: var(--spacing-xl) var(--spacing-lg); text-align: center; box-shadow: var(--shadow-md); position: relative; } .main-header h1 { font-size: 2.2rem; font-weight: 700; margin-bottom: var(--spacing-md); position: relative; letter-spacing: 0.5px; } .main-header p { font-size: 1rem; line-height: 1.6; max-width: 700px; margin: 0 auto; opacity: 0.9; position: relative; } /* Header de módulo - Estilos comunes */ .module-header { display: none; background: var(--primary-color); color: var(--text-light); padding: var(--spacing-md) var(--spacing-lg); box-shadow: var(--shadow-md); position: sticky; top: 0; z-index: 100; align-items: center; min-height: 60px; transition: opacity 0.2s ease; } .module-header.active { display: flex; } /* Título del módulo - común para ambas vistas */ .module-title { font-weight: 700; text-align: center; letter-spacing: 0.5px; } /* Botón de retroceso - estilos comunes */ .module-back { background-color: #00c853; border: none; color: var(--text-light); border-radius: var(--border-radius-sm); display: flex; align-items: center; cursor: pointer; transition: var(--transition-fast); } .module-back:hover { background-color: #00a040; transform: scale(1.05); } .module-back .icon-arrow { margin-right: 4px; } .module-back .back-text { margin: 0 4px; font-weight: 500; } .module-back .icon-module { font-size: 1.2rem; } /* Indicador de estado - estilos comunes */ .module-status { font-weight: 600; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px; } .module-status.active { background-color: var(--success-color); } .module-status.waiting { background-color: var(--waiting-color); } /* ESTILOS PARA PC/LAPTOP (pantallas más grandes) */ @media (min-width: 769px) { /* Estructura del header para PC */ .module-header { justify-content: space-between; } /* Fila para móviles que debe ocultarse en PC */ .module-header-row { display: none; } /* Título en PC */ .module-title { font-size: 1.4rem; flex: 1; margin: 0 auto; } /* Botón en PC */ .module-back { min-width: 100px; height: 36px; padding: 0 10px; justify-content: space-between; } /* Estado en PC */ .module-status { font-size: 0.75rem; padding: var(--spacing-xs) var(--spacing-sm); } /* Esconder elementos móviles en PC */ .mobile-only { display: none !important; } /* Altura del iframe para PC */ .iframe-container.active { padding-top: 60px; } } /* ESTILOS PARA MÓVILES (pantallas más pequeñas) */ @media (max-width: 768px) { /* Estructura del header para móviles */ .module-header { flex-direction: column; padding: 8px 12px; min-height: 90px; } /* Primera fila para móviles */ .module-header-row { display: flex; width: 100%; justify-content: space-between; align-items: center; margin-bottom: 8px; } /* Título en móviles */ .module-title { font-size: 1.1rem; width: 100%; margin-top: 4px; } /* Botón en móviles */ .module-back { min-width: 90px; height: 32px; padding: 0 8px; justify-content: space-between; } /* Estado en móviles */ .module-status { font-size: 0.75rem; padding: var(--spacing-xs) var(--spacing-sm); } /* Esconder elementos PC en móviles */ .pc-only { display: none !important; } /* Altura del iframe para móviles */ .iframe-container.active { padding-top: 90px; } /* Adaptaciones para visualización en móviles */ .enlaces-container { grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: var(--spacing-md); } .main-content { padding: var(--spacing-lg) var(--spacing-md); } .main-header h1 { font-size: 1.8rem; } .page-title { font-size: 1.4rem; } .desarrollo-icon { width: 80px; height: 80px; font-size: 3rem; } .desarrollo-title { font-size: 1.5rem; } .desarrollo-message { font-size: 1rem; } }/* Estilos para pantallas muy pequeñas */ @media (max-width: 576px) { .module-header { min-height: 80px; padding: 6px 10px; } .module-title { font-size: 0.95rem; } .module-back { min-width: 80px; height: 30px; padding: 0 6px; } .module-back .back-text { font-size: 0.8rem; } .module-status { font-size: 0.7rem; padding: 3px 6px; } .iframe-container.active { padding-top: 80px; } .enlaces-container { grid-template-columns: 1fr; gap: var(--spacing-md); } .enlace-item { min-height: auto; padding: var(--spacing-md); } .enlace-icon { width: 40px; height: 40px; font-size: 1.5rem; } .enlace-title { font-size: 1.1rem; } .enlace-descripcion { font-size: 0.85rem; } .main-header { padding: var(--spacing-lg) var(--spacing-md); } .main-header h1 { font-size: 1.5rem; margin-bottom: var(--spacing-sm); } .main-header p { font-size: 0.9rem; } } @media (max-width: 350px) { .module-title { font-size: 0.85rem; } .module-back { min-width: 70px; height: 28px; } .module-back .back-text { font-size: 0.75rem; } } /* Contenido principal */ .main-content { max-width: 1200px; margin: 0 auto; padding: var(--spacing-xl) var(--spacing-lg); } .page-title { color: var(--primary-color); font-size: 1.5rem; font-weight: 700; margin-bottom: var(--spacing-xl); position: relative; display: inline-block; } .page-title::after { content: ; position: absolute; left: 0; bottom: -8px; width: 40px; height: 3px; background-color: var(--primary-color); border-radius: 2px; } /* Grid de enlaces */ .enlaces-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--spacing-lg); will-change: transform; /* Optimización de rendimiento */ } /* Tarjetas de módulo */ .enlace-item { background-color: var(--card-bg); border-radius: var(--border-radius); padding: var(--spacing-lg); cursor: pointer; transition: transform 0.2s ease, box-shadow 0.2s ease; box-shadow: var(--shadow-sm); position: relative; border: 1px solid var(--border-color); min-height: 180px; display: flex; flex-direction: column; overflow: hidden; will-change: transform; /* Optimización de rendimiento */ } /* Borde izquierdo con color según estado */ .enlace-item.status-active { border-left: 4px solid #00c853; /* Verde para módulos activos */ } .enlace-item.status-waiting { border-left: 4px solid #FF9800; /* Naranja para módulos en espera */ } .enlace-item:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); background-color: var(--card-hover); } /* Iconos en tarjetas de módulo */ .enlace-icon { color: var(--primary-color); font-size: 1.6rem; margin-bottom: var(--spacing-md); transition: var(--transition-normal); width: 50px; height: 50px; background-color: var(--primary-light); border-radius: var(--border-radius-sm); display: flex; align-items: center; justify-content: center; border: 1px solid rgba(0, 0, 0, 0.05); } .enlace-item.status-active .enlace-icon { color: #00c853; background-color: rgba(0, 200, 83, 0.1); border: 1px solid rgba(0, 200, 83, 0.3); } .enlace-item.status-waiting .enlace-icon { color: #FF9800; background-color: rgba(255, 152, 0, 0.1); border: 1px solid rgba(255, 152, 0, 0.3); } .enlace-title { font-weight: 700; font-size: 1.2rem; margin-bottom: var(--spacing-sm); color: var(--text-primary); transition: var(--transition-normal); } .enlace-descripcion { font-size: 0.9rem; color: var(--text-secondary); line-height: 1.6; margin-bottom: var(--spacing-md); flex-grow: 1; } .status-indicator { position: absolute; top: var(--spacing-md); right: var(--spacing-md); width: 10px; height: 10px; border-radius: 50%; } .status-text { font-size: 0.8rem; font-weight: 600; padding: var(--spacing-xs) var(--spacing-sm); border-radius: 20px; display: inline-block; margin-top: auto; } /* Estado activo */ .enlace-item.status-active .status-indicator { background-color: var(--success-color); box-shadow: 0 0 0 3px rgba(0, 200, 83, 0.2); } /* Etiqueta Activo con estilo verde */ .enlace-item.status-active .status-text { background-color: rgba(0, 200, 83, 0.1); color: #00c853; padding: 4px 10px; border-radius: 4px; font-size: 0.8rem; font-weight: 600; } /* Estado en espera */ .enlace-item.status-waiting .status-indicator { background-color: var(--waiting-color); box-shadow: 0 0 0 3px rgba(255, 152, 0, 0.2); } .enlace-item.status-waiting .status-text { color: var(--waiting-color); background-color: rgba(255, 152, 0, 0.1); } /* Contenedor de desarrollo */ .desarrollo-container { display: none; width: 100%; background-color: var(--card-bg); text-align: center; padding: var(--spacing-xl) var(--spacing-lg); border-radius: var(--border-radius); box-shadow: var(--shadow-sm); margin: var(--spacing-lg) auto; max-width: 800px; transition: opacity 0.2s ease; } .desarrollo-container.active { display: block; animation: fadeIn 0.5s ease; } .desarrollo-icon { font-size: 4rem; color: var(--primary-color); margin-bottom: var(--spacing-lg); opacity: 0.8; background-color: var(--primary-light); width: 100px; height: 100px; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-left: auto; margin-right: auto; } .desarrollo-title { font-size: 1.8rem; color: var(--text-primary); margin-bottom: var(--spacing-md); font-weight: 700; } .desarrollo-message { font-size: 1.1rem; color: var(--text-secondary); max-width: 600px; margin: 0 auto var(--spacing-lg); line-height: 1.6; } .desarrollo-fecha { font-size: 0.9rem; color: var(--waiting-color); font-weight: 600; background-color: rgba(255, 152, 0, 0.1); padding: var(--spacing-sm) var(--spacing-md); border-radius: 20px; display: inline-block; } /* Contenedor de iframe */ .iframe-container { display: none; width: 100%; height: 0; position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 90; background-color: var(--light-bg); transition: opacity 0.2s ease; } .iframe-container.active { display: block; height: 100%; } iframe { width: 100%; height: 100%; border: none; display: block; opacity: 0; transition: opacity 0.3s ease; } iframe.loaded { opacity: 1; } /* Estados ocultos */ .main-content.hidden, .main-header.hidden { display: none; } /* Animaciones */ @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* Indicador de carga */ .loading-indicator { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: rgba(26, 42, 66, 0.9); color: white; padding: 20px; border-radius: 8px; z-index: 1000; display: flex; align-items: center; gap: 10px; font-weight: 500; box-shadow: var(--shadow-md); } .loading-indicator i { font-size: 1.2rem; } /* Animación de carga */ @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .fa-spin { animation: spin 1s linear infinite; } /* Optimización para móviles */ .prefetch-container { position: absolute; width: 0; height: 0; overflow: hidden; visibility: hidden; } /style>/head>body> !-- Encabezado principal --> header classmain-header idmain-header> h1>INTEGRIDAD OPERACIONAL DE RIESGOS/h1> p>Panel de control para el monitoreo de enlaces críticos relacionados con la seguridad y el rendimiento operativo/p> /header> !-- Encabezado del módulo con estructura adaptativa para PC y móviles --> header classmodule-header idmodule-header> !-- Elementos visibles solamente en versión móvil --> div classmodule-header-row mobile-only> !-- Botón de retroceso con texto Atrás e icono --> button classmodule-back idmodule-back-mobile aria-labelVolver al panel principal> i classfas fa-arrow-left icon-arrow>/i> span classback-text>Atrás/span> i classfas fa-calendar-alt icon-module idmodule-icon-back-mobile>/i> /button> !-- Estado del módulo --> div classmodule-status active mobile-only idmodule-status-mobile>Activo/div> /div> !-- Botón de retroceso para PC/Laptop --> button classmodule-back pc-only idmodule-back-pc aria-labelVolver al panel principal> i classfas fa-arrow-left icon-arrow>/i> span classback-text>Atrás/span> i classfas fa-calendar-alt icon-module idmodule-icon-back-pc>/i> /button> !-- Título centrado - visible en ambas versiones --> div classmodule-title>INTEGRIDAD OPERACIONAL DE RIESGOS/div> !-- Estado del módulo para PC/Laptop --> div classmodule-status active pc-only idmodule-status-pc>Activo/div> /header> !-- Contenido principal --> main classmain-content idmain-content> h2 classpage-title>Panel de Control/h2> div idenlaces-container classenlaces-container> !-- Los enlaces se generarán dinámicamente con JavaScript --> /div> /main> !-- Contenedor para el iframe --> div idiframe-container classiframe-container> iframe idcontent-iframe titleContenido de enlace sandboxallow-same-origin allow-scripts allow-forms allow-popups>/iframe> /div> !-- Contenedor para mensaje de módulo en desarrollo --> div iddesarrollo-container classdesarrollo-container> div classdesarrollo-icon> i classfas fa-code>/i> /div> h3 classdesarrollo-title>Módulo en desarrollo/h3> p classdesarrollo-message>Este módulo se encuentra actualmente en fase de desarrollo y estará disponible próximamente. Estamos trabajando para implementar todas las funcionalidades requeridas./p> div classdesarrollo-fecha>Fecha estimada de lanzamiento: 01/06/2026/div> /div> !-- Contenedor para precargar iframes (optimización) --> div idprefetch-container classprefetch-container>/div> script> /** * Aplicación de Integridad Operacional de Riesgos - VERSIÓN OPTIMIZADA * Sistema de navegación y visualización de módulos */ (function() { use strict; // Configuración de la aplicación const config { defaultModuleIcon: fa-link, activeStatusText: Activo, waitingStatusText: En desarrollo, developmentModuleUrl: #modulo-en-desarrollo, agendaIdentifier: equipos.iorecu.com, prefetchEnabled: true, animationsEnabled: true, loadingIndicatorTimeout: 5000 // Timeout para el indicador de carga (ms) }; // Datos de módulos disponibles - Se crea una sola vez const modules { nombre: Seguimiento de equipos, url: https://equipos.iorecu.com/, icono: fa-shield-halved, estado: active, descripcion: Recordatorio de mantenimiento de equipos e inspecciones periódicas con alertas automáticas y reportes de cumplimiento. }, { nombre: Actividad operacional, url: https://actividades.iorecu.com/, icono: fa-chart-line, estado: active, descripcion: Gestión integral de actividades, riesgos operativos e indicadores de seguridad. }, { nombre: Registro de incidentes, url: config.developmentModuleUrl, icono: fa-triangle-exclamation, estado: waiting, descripcion: Sistema de registro y seguimiento de incidentes operacionales con análisis de causa raíz. }, { nombre: Agenda, url: https://agenda.iorecu.com/, icono: fa-calendar-alt, estado: active, descripcion: Sistema de agenda para el registro y seguimiento de actividades, reuniones y compromisos con reportabilidad integrada. } ; // Referencias a elementos del DOM - Cache para mejorar rendimiento const elements { mainHeader: document.getElementById(main-header), mainContent: document.getElementById(main-content), enlacesContainer: document.getElementById(enlaces-container), moduleHeader: document.getElementById(module-header), moduleBackPC: document.getElementById(module-back-pc), moduleBackMobile: document.getElementById(module-back-mobile), moduleIconPC: document.getElementById(module-icon-back-pc), moduleIconMobile: document.getElementById(module-icon-back-mobile), moduleStatusPC: document.getElementById(module-status-pc), moduleStatusMobile: document.getElementById(module-status-mobile), moduleTitle: document.querySelector(.module-title), iframeContainer: document.getElementById(iframe-container), contentIframe: document.getElementById(content-iframe), desarrolloContainer: document.getElementById(desarrollo-container), prefetchContainer: document.getElementById(prefetch-container) }; // Variables para gestión de carga y caché let loadingIndicator null; let loadingTimeout null; let moduleCache {}; // Cache para URLs ya visitados /** * Inicialización de la aplicación - ACTUALIZADO */ function init() { // Verificar y limpiar cualquier hash en la URL al iniciar if (window.location.hash) { // Si hay un hash en la URL al iniciar, ignorarlo y mostrar la vista principal window.history.replaceState({view: main}, Panel Principal, window.location.pathname); } // Configurar un estado inicial para la navegación if (!window.history.state) { window.history.replaceState({view: main}, Panel Principal, window.location.pathname); } // Renderizar los módulos disponibles (una sola vez) renderModules(modules); // Configurar eventos (solo una vez) setupEventListeners(); // Detectar tipo de dispositivo y ajustar la interfaz adjustInterfaceByDevice(); // Pre-cargar los URLs de módulos activos para una carga más rápida if (config.prefetchEnabled) { prefetchActiveModules(); } // Optimizar carga de iframe setupIframeOptimization(); // Forzar visualización de la vista principal al iniciar elements.moduleHeader.classList.remove(active); elements.mainHeader.classList.remove(hidden); elements.mainContent.classList.remove(hidden); elements.iframeContainer.classList.remove(active); elements.desarrolloContainer.classList.remove(active); } /** * Pre-carga los módulos activos para mejorar el rendimiento */ function prefetchActiveModules() { const activeModules modules.filter(module > module.estado active && module.url ! config.developmentModuleUrl); activeModules.forEach(module > { const link document.createElement(link); link.rel prefetch; link.href module.url; document.head.appendChild(link); }); } /** * Renderiza la lista de módulos en la interfaz * @param {Array} modules - Lista de módulos a renderizar * Optimizado: Creamos un fragmento de documento para reducir reflows */ function renderModules(modules) { // Crear un fragmento de documento para reducir reflows const fragment document.createDocumentFragment(); modules.forEach(module > { const moduleElement createModuleElement(module); fragment.appendChild(moduleElement); }); // Añadir todos los módulos de una vez elements.enlacesContainer.appendChild(fragment); } /** * Crea un elemento HTML para un módulo * @param {Object} module - Datos del módulo * @returns {HTMLElement} - Elemento DOM del módulo * Optimizado: Eliminada la creación de listeners individuales * Optimizado: Usamos delegación de eventos en su lugar */ function createModuleElement(module) { const moduleElement document.createElement(div); moduleElement.className `enlace-item status-${module.estado || waiting}`; moduleElement.setAttribute(data-url, module.url || config.developmentModuleUrl); moduleElement.setAttribute(data-icono, module.icono || getDefaultIcon(module.nombre)); moduleElement.setAttribute(data-estado, module.estado || waiting); moduleElement.setAttribute(data-nombre, module.nombre); const icono module.icono || getDefaultIcon(module.nombre); const estadoTexto module.estado active ? config.activeStatusText : config.waitingStatusText; moduleElement.innerHTML ` div classenlace-icon> i classfas ${icono}>/i> /div> div classenlace-title>${module.nombre}/div> div classenlace-descripcion>${module.descripcion || Sin descripción disponible}/div> div classstatus-indicator>/div> div classstatus-text>${estadoTexto}/div> `; // Ya no añadimos listener para cada tarjeta - usamos delegación de eventos return moduleElement; } /** * Obtiene el icono predeterminado para un módulo según su nombre * @param {string} moduleName - Nombre del módulo * @returns {string} - Clase de icono */ function getDefaultIcon(moduleName) { const name moduleName.toLowerCase(); if (name.includes(agenda)) return fa-calendar-alt; if (name.includes(indicador)) return fa-chart-line; if (name.includes(incidente)) return fa-triangle-exclamation; if (name.includes(equip)) return fa-shield-halved; return config.defaultModuleIcon; } /** * Muestra un indicador de carga * @returns {HTMLElement} - El elemento del indicador de carga */ function showLoading() { // Si ya hay un indicador activo, lo reutilizamos if (loadingIndicator) { return loadingIndicator; } // Crear nuevo indicador loadingIndicator document.createElement(div); loadingIndicator.className loading-indicator; loadingIndicator.innerHTML i classfas fa-spinner fa-spin>/i> Cargando...; document.body.appendChild(loadingIndicator); // Configurar timeout para ocultar automáticamente if (loadingTimeout) { clearTimeout(loadingTimeout); } loadingTimeout setTimeout(() > { hideLoading(); }, config.loadingIndicatorTimeout); return loadingIndicator; } /** * Oculta el indicador de carga */ function hideLoading() { if (loadingIndicator && loadingIndicator.parentNode) { loadingIndicator.parentNode.removeChild(loadingIndicator); loadingIndicator null; } if (loadingTimeout) { clearTimeout(loadingTimeout); loadingTimeout null; } } /** * Configura optimización para iframe */ function setupIframeOptimization() { // Añadir evento para mostrar iframe solo cuando está cargado elements.contentIframe.addEventListener(load, function() { this.classList.add(loaded); hideLoading(); }); } /** * Función común para volver al panel principal - declarada fuera para poder removerla */ function goBack() { window.history.replaceState(null, document.title, window.location.pathname); toggleViews(false); } /** * Función para manejar clics en módulos - declarada fuera para poder removerla */ function handleModuleClick(event) { // Encontrar el elemento de módulo más cercano let target event.target; while (target && !target.classList.contains(enlace-item)) { if (target this) return; // No encontrado target target.parentElement; } if (target && target.classList.contains(enlace-item)) { openModule(target); } } /** * Recrea los event listeners después de la navegación * Esta función elimina y vuelve a crear los listeners principales */ /** * Recrea los event listeners después de la navegación * Esta función elimina y vuelve a crear los listeners principales */function recreateEventListeners() { // Primero remover los existentes if (elements.moduleBackPC) { elements.moduleBackPC.removeEventListener(click, goBack); } if (elements.moduleBackMobile) { elements.moduleBackMobile.removeEventListener(click, goBack); } // Eliminar el listener de delegación elements.enlacesContainer.removeEventListener(click, handleModuleClick); // Volver a aplicar los listeners // Asociar función a botón de retroceso en PC if (elements.moduleBackPC) { elements.moduleBackPC.addEventListener(click, goBack); } // Asociar función a botón de retroceso en móvil if (elements.moduleBackMobile) { elements.moduleBackMobile.addEventListener(click, goBack); } // Delegación de eventos para módulos (un solo listener) elements.enlacesContainer.addEventListener(click, handleModuleClick);} /** * Abre un módulo seleccionado - OPTIMIZADO * @param {HTMLElement} moduleElement - Elemento del módulo seleccionado * @param {boolean} fromHistory - Indica si la apertura es desde la navegación del historial */ function openModule(moduleElement, fromHistory false) { // Mostrar indicador de carga showLoading(); // Obtener datos del módulo const moduleIconClass moduleElement.getAttribute(data-icono); const moduleName moduleElement.getAttribute(data-nombre); const moduleState moduleElement.getAttribute(data-estado); const moduleUrl moduleElement.getAttribute(data-url); // Gestionar el historial del navegador (solo si no proviene de navegación por historial) if (!fromHistory) { const slug moduleName.toLowerCase().replace(/\s+/g, -); // Añadir entrada al historial para este módulo window.history.pushState( {view: module, moduleName: moduleName}, `Módulo - ${moduleName}`, `#${slug}` ); } // Actualizar interfaz con requestAnimationFrame para mejor rendimiento requestAnimationFrame(() > { // Actualizar icono en los botones de retroceso (en paralelo) updateModuleIcons(moduleIconClass); // Actualizar estado en el encabezado updateModuleStatus(moduleState); // Mostrar cabecera del módulo y ocultar contenido principal toggleViews(true); // Usar setTimeout para permitir que la UI se actualice primero setTimeout(() > { // Cargar contenido del módulo loadModuleContent(moduleUrl); // Ajustar la vista según el dispositivo adjustInterfaceByDevice(); }, 10); // Pequeño retraso para permitir actualización de la UI }); } /** * Actualiza los iconos de los botones de retroceso * @param {string} iconClass - Clase de icono a aplicar */ function updateModuleIcons(iconClass) { // Actualizar ambos iconos a la vez if (elements.moduleIconPC) { elements.moduleIconPC.className `fas ${iconClass} icon-module`; } if (elements.moduleIconMobile) { elements.moduleIconMobile.className `fas ${iconClass} icon-module`; } } /** * Actualiza el estado en la cabecera del módulo - OPTIMIZADO * @param {string} estado - Estado del módulo */ function updateModuleStatus(estado) { const statusText estado active ? config.activeStatusText : config.waitingStatusText; const statusClass estado active ? active : waiting; // Aplicar actualizaciones de forma optimizada requestAnimationFrame(() > { // Actualizar estado para PC if (elements.moduleStatusPC) { elements.moduleStatusPC.textContent statusText; elements.moduleStatusPC.className `module-status ${statusClass} pc-only`; } // Actualizar estado para móvil if (elements.moduleStatusMobile) { elements.moduleStatusMobile.textContent statusText; elements.moduleStatusMobile.className `module-status ${statusClass} mobile-only`; } }); } /** * Alterna entre vista principal y vista de módulo - OPTIMIZADO * @param {boolean} showModule - Indica si se debe mostrar la vista de módulo */ function toggleViews(showModule) { // Ejecutar como una sola operación de renderizado requestAnimationFrame(() > { if (showModule) { // Al mostrar el módulo elements.moduleHeader.classList.add(active); elements.mainHeader.classList.add(hidden); elements.mainContent.classList.add(hidden); } else { // Al volver al panel principal elements.moduleHeader.classList.remove(active); elements.mainHeader.classList.remove(hidden); elements.mainContent.classList.remove(hidden); // Limpiar contenido del iframe para liberar memoria setTimeout(() > { elements.iframeContainer.classList.remove(active); elements.desarrolloContainer.classList.remove(active); elements.contentIframe.classList.remove(loaded); // Retrasar la limpieza del src para evitar parpadeo setTimeout(() > { if (!elements.iframeContainer.classList.contains(active)) { elements.contentIframe.src ; } }, 300); }, 50); } }); } /** * Ajusta la interfaz según el tipo de dispositivo - OPTIMIZADO * Usa debouncing para evitar múltiples recálculos */ let resizeTimeout null; function adjustInterfaceByDevice() { // Cancelar timeout anterior si existe if (resizeTimeout) { clearTimeout(resizeTimeout); } // Configurar nuevo timeout para debouncing resizeTimeout setTimeout(() > { const isMobile window.innerWidth 768; const viewportWidth window.innerWidth; // Ejecutar como una sola operación de renderizado requestAnimationFrame(() > { // Ajustar padding del iframe según el dispositivo if (elements.iframeContainer.classList.contains(active)) { if (isMobile) { // Para móviles const paddingValue viewportWidth 576 ? 80px : 90px; if (elements.iframeContainer.style.paddingTop ! paddingValue) { elements.iframeContainer.style.paddingTop paddingValue; } } else { // Para PC/laptop if (elements.iframeContainer.style.paddingTop ! 60px) { elements.iframeContainer.style.paddingTop 60px; } } } // Ajustar tamaño de fuente del título if (elements.moduleTitle) { let fontSize; if (isMobile) { if (viewportWidth 350) { fontSize 0.85rem; } else if (viewportWidth 400) { fontSize 0.9rem; } else if (viewportWidth 576) { fontSize 0.95rem; } else { fontSize 1.1rem; } } else { fontSize 1.4rem; } // Solo actualizar si es necesario if (elements.moduleTitle.style.fontSize ! fontSize) { elements.moduleTitle.style.fontSize fontSize; } } }); resizeTimeout null; }, 100); // 100ms de debounce } /** * Carga el contenido del módulo según su URL - OPTIMIZADO * @param {string} url - URL del módulo */ function loadModuleContent(url) { // Verificar si es un módulo en desarrollo if (url config.developmentModuleUrl) { requestAnimationFrame(() > { elements.iframeContainer.classList.remove(active); elements.contentIframe.classList.remove(loaded); elements.desarrolloContainer.classList.add(active); hideLoading(); // Ocultar indicador inmediatamente }); return; } // Verificar si ya existe en caché const useCache moduleCacheurl && config.prefetchEnabled; // Preparar el contenedor requestAnimationFrame(() > { elements.desarrolloContainer.classList.remove(active); // Resetear iframe para evitar problemas de carga elements.contentIframe.classList.remove(loaded); // Mostrar contenedor de iframe elements.iframeContainer.classList.add(active); // Cargar URL if (elements.contentIframe.src ! url) { elements.contentIframe.src url; } else { // Si ya está cargada, marcar como cargada elements.contentIframe.classList.add(loaded); hideLoading(); } // Añadir a caché moduleCacheurl true; }); } /** * Configura los listeners de eventos de la aplicación - OPTIMIZADO * Incluye soporte mejorado para el botón atrás del navegador */ function setupEventListeners() { // Asociar función a botón de retroceso en PC if (elements.moduleBackPC) { elements.moduleBackPC.addEventListener(click, goBack); } // Asociar función a botón de retroceso en móvil if (elements.moduleBackMobile) { elements.moduleBackMobile.addEventListener(click, goBack); } // Delegación de eventos para módulos (un solo listener) elements.enlacesContainer.addEventListener(click, handleModuleClick); // Manejar eventos del botón atrás del navegador y el estado inicialwindow.addEventListener(popstate, function(event) { // Forzar la visualización de la vista principal cuando se navega hacia atrás // independientemente del estado anterior elements.moduleHeader.classList.remove(active); elements.mainHeader.classList.remove(hidden); elements.mainContent.classList.remove(hidden); elements.iframeContainer.classList.remove(active); elements.desarrolloContainer.classList.remove(active); // Configurar estilos directamente para asegurar la visibilidad elements.mainHeader.style.display block; elements.mainContent.style.display block; elements.moduleHeader.style.display none; elements.iframeContainer.style.display none; elements.desarrolloContainer.style.display none; // Limpiar el iframe inmediatamente elements.contentIframe.src ; elements.contentIframe.classList.remove(loaded); // Redefinir el estado del historial para mantener consistencia window.history.replaceState({view: main}, Panel Principal, window.location.pathname); // Recrear los event listeners para asegurar que todo sigue funcionando recreateEventListeners(); // Limpiar cualquier cache que pueda estar interfiriendo moduleCache {}; // En casos extremos, si continúa el problema, recargar las tarjetas requestAnimationFrame(() > { // Vaciar y volver a llenar el contenedor de enlaces elements.enlacesContainer.innerHTML ; renderModules(modules); }); // Lanzar un evento de resize para que se ajuste la interfaz correctamente window.dispatchEvent(new Event(resize));}); // Al cargar la página, establecer el estado inicial en el historial if (!window.history.state) { window.history.replaceState({view: main}, Panel Principal, window.location.pathname); } // Escuchar cambios de tamaño de ventana (con debounce incorporado) window.addEventListener(resize, adjustInterfaceByDevice); // Escuchar cambios de orientación en dispositivos móviles window.addEventListener(orientationchange, adjustInterfaceByDevice); // Escuchar errores de carga del iframe elements.contentIframe.addEventListener(error, function() { hideLoading(); // Mostrar mensaje de error si es necesario }); } /** * Función pública para agregar un nuevo módulo - OPTIMIZADO * @param {string} nombre - Nombre del módulo * @param {string} url - URL del módulo * @param {string} descripcion - Descripción del módulo * @param {string} icono - Icono del módulo * @param {string} estado - Estado del módulo (active/waiting) * @returns {HTMLElement} - Elemento del módulo creado */ window.agregarEnlace function(nombre, url, descripcion, icono config.defaultModuleIcon, estado null) { // Si hay un módulo seleccionado, volver al panel principal if (elements.moduleHeader.classList.contains(active)) { // Determinar qué botón está visible según el dispositivo const backButton window.innerWidth 768 ? elements.moduleBackMobile : elements.moduleBackPC; if (backButton) { backButton.click(); } } // Determinar estado según URL si no se proporciona if (estado null) { estado url.includes(config.agendaIdentifier) ? active : waiting; } // Formatear URL para módulos en desarrollo const moduleUrl (!url || url #) ? config.developmentModuleUrl : url; // Crear módulo con los datos proporcionados const moduleData { nombre: nombre, url: moduleUrl, icono: icono, estado: estado, descripcion: descripcion || Sin descripción disponible }; // Usar requestAnimationFrame para optimizar la inserción en el DOM return new Promise(resolve > { requestAnimationFrame(() > { const moduleElement createModuleElement(moduleData); elements.enlacesContainer.appendChild(moduleElement); // Precargar URL si está activo if (estado active && moduleUrl ! config.developmentModuleUrl && config.prefetchEnabled) { const link document.createElement(link); link.rel prefetch; link.href moduleUrl; document.head.appendChild(link); // Añadir a caché moduleCachemoduleUrl true; } resolve(moduleElement); }); }); }; /** * Función pública para cargar múltiples módulos - OPTIMIZADO * @param {Array} modules - Lista de módulos a cargar */ window.cargarEnlaces function(modules) { // Si hay un módulo seleccionado, volver al panel principal if (elements.moduleHeader.classList.contains(active)) { // Determinar qué botón está visible según el dispositivo const backButton window.innerWidth 768 ? elements.moduleBackMobile : elements.moduleBackPC; if (backButton) { backButton.click(); } } // Usar fragmento para minimizar reflows const fragment document.createDocumentFragment(); // Limpiar contenedor de forma optimizada requestAnimationFrame(() > { // Vaciar contenedor elements.enlacesContainer.innerHTML ; // Crear y añadir cada módulo al fragmento modules.forEach(module > { const moduleElement createModuleElement({ nombre: module.nombre, url: module.url || config.developmentModuleUrl, icono: module.icono || getDefaultIcon(module.nombre), estado: module.estado || (module.url && module.url.includes(config.agendaIdentifier) ? active : waiting), descripcion: module.descripcion || Sin descripción disponible }); fragment.appendChild(moduleElement); // Precargar URLs activas if (module.estado active && module.url && module.url ! config.developmentModuleUrl && config.prefetchEnabled) { moduleCachemodule.url true; const link document.createElement(link); link.rel prefetch; link.href module.url; document.head.appendChild(link); } }); // Añadir el fragmento al DOM (una sola operación) elements.enlacesContainer.appendChild(fragment); }); }; /** * Configura protecciones para el contenido - OPTIMIZADO * Reducido para mejor rendimiento */ function setupContentProtection() { // Implementamos protecciones básicas para el contenido // con un enfoque optimizado que reduce la carga del navegador // Handler unificado para prevenir acciones no deseadas const preventDefaultHandler function(e) { e.preventDefault(); return false; }; // Aplicamos solo los listeners esenciales para mejorar el rendimiento document.addEventListener(contextmenu, preventDefaultHandler); // Bloqueamos teclas esenciales con un solo listener document.addEventListener(keydown, function(event) { // Array de combinaciones bloqueadas const blockedKeys event.keyCode 123, // F12 event.ctrlKey && event.shiftKey && 73, 74, 67.includes(event.keyCode), // Ctrl+Shift+I/J/C event.ctrlKey && event.keyCode 85 // Ctrl+U ; if (blockedKeys.some(condition > condition)) { event.preventDefault(); return false; } }); } // Medición de rendimiento (opcional) const performanceMetrics { startTime: 0, moduleLoadTimes: {}, start: function() { this.startTime performance.now(); }, measureModuleLoad: function(moduleName) { const loadTime performance.now() - this.startTime; this.moduleLoadTimesmoduleName loadTime; console.log(`Módulo ${moduleName} cargado en ${loadTime.toFixed(2)}ms`); this.startTime performance.now(); // Reset para siguiente medición } }; // Iniciar aplicación cuando el DOM esté cargado if (document.readyState loading) { document.addEventListener(DOMContentLoaded, init); } else { // El DOM ya está cargado setTimeout(init, 0); } })(); // Event listener para service workers (opcional para futuras mejoras) if (serviceWorker in navigator) { window.addEventListener(load, function() { // Aquí podríamos registrar un service worker para caché offline // navigator.serviceWorker.register(/sw.js); }); } /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]