El firewall de red aprovecha nuestra red global de inteligencia de amenazas, que recopila datos de ataques de más de 57 millones de dominios en todo el mundo. Cuando se detecta un ataque en un servidor, la IP infractora se bloquea inmediatamente en toda la red, evitando que ese atacante llegue a cualquier otro servidor protegido por Imunify. Detiene a los actores maliciosos conocidos en el perímetro exterior antes de que puedan intentar explotar una vulnerabilidad.
WebShield se sitúa delante de los servidores web para detectar y filtrar el tráfico malicioso, incluidos los ataques de botnets y los intentos de denegación de servicio (DoS). Para el tráfico sospechoso, presenta nuestro desafío de JavaScript invisible, que bloquea eficazmente a los bots automatizados mientras permite el paso de los visitantes humanos. Garantiza la disponibilidad del servidor y evita los intentos de inicio de sesión por fuerza bruta sin frustrar a los usuarios legítimos con los CAPTCHA tradicionales.
El WAF inspecciona el tráfico entrante para identificar y bloquear ataques comunes a aplicaciones web como inyecciones SQL, cross-site scripting y acceso ilegal a recursos. También proporciona parches virtuales al bloquear los intentos de explotar vulnerabilidades conocidas en software popular (como complementos de WordPress) antes de que se publique o se pueda aplicar un parche oficial, protegiendo los sitios de ser comprometidos a través de su propio código.
Nuestro escáner integral realiza análisis en tiempo real y bajo demanda de todos los archivos del servidor en busca de firmas de malware, puertas traseras y otras amenazas. También incluye un escáner de bases de datos, que inspecciona las bases de datos de aplicaciones CMS populares (WordPress, Joomla y más) para encontrar infecciones, y busca tareas cron maliciosas, cerrando una puerta trasera común utilizada por los atacantes.
Este es nuestro motor de evaluación de scripts PHP en tiempo real. Analiza lo que hacen los scripts PHP mientras se ejecutan, identificando y bloqueando el comportamiento malicioso antes de que pueda causar daño. Esta es nuestra respuesta a los ataques de día cero, ya que detiene incluso las amenazas nuevas y desconocidas que los escáneres tradicionales basados en firmas pasarían por alto.
El IDS/IPS supervisa continuamente los registros del servidor en busca de signos de actividad sospechosa, como intentos fallidos de inicio de sesión repetidos. Cuando detecta un patrón que indica un ataque de fuerza bruta o un intento de explotación, bloquea automáticamente la dirección IP infractora, protegiendo todos los servicios del servidor, no solo los sitios web.
.layer-text {
color: #2C3340;
text-align: center;
font-family: Poppins;
font-size: 32px;
font-style: normal;
font-weight: 700;
line-height: normal;
text-transform: uppercase;
}
.layer {
border-radius: 4px;
border: 2px solid #2C3340;
background: linear-gradient(180deg, #ECF8FF 0%, #D0DCE6 100%);
padding: 7px 24px 7px 9px;
}
.layer-box {
display: flex;
align-items: center;
justify-content: space-between;
}
.toggle-text {
padding: 30px 44px;
color: #0C1218;
font-family: Poppins;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: normal;
}
.layer1, .layer2, .layer5 {
padding: 7px 24px 7px 9px;
}
.layer3, .layer4 {
padding: 13px 24px 13px 15px;
}
/* Remove vertical gap when closed; animate padding for a smooth slide */
.layers .toggle-text {
max-height: 0;
opacity: 0;
overflow: hidden;
padding: 30px 44px; /* open state padding */
transition: max-height 300ms ease, opacity 300ms ease, padding 300ms ease;
will-change: max-height, opacity, padding;
}
.layers .toggle-text[aria-hidden="true"] {
padding-top: 0;
padding-bottom: 0; /* no vertical space when closed */
}
/* Pointer + subtle img fade to reduce swap flicker */
.layers .layer { cursor: pointer; }
.layers .layer .layer-box img { transition: opacity 150ms ease; }
/* Optional: keyboard focus ring */
.layers .layer:focus-within,
.layers .layer:focus { outline: 2px solid #2C3340; outline-offset: 2px; }
.layers .toggle-text {
max-height: 0;
opacity: 0;
overflow: hidden;
padding: 30px 44px; /* open-state padding */
transition: max-height 300ms ease, opacity 300ms ease, padding 300ms ease;
will-change: max-height, opacity, padding;
}
.layers .toggle-text[aria-hidden="true"] {
padding-top: 0;
padding-bottom: 0;
}
// Layers hover-to-open with slide; no clipping on long/late-wrapping text
(function () {
'use strict';
const GREEN_ARROW = 'https://imunify360.com/wp-content/uploads/2025/09/Vector-8.png';
const $$ = (sel, ctx) => Array.prototype.slice.call((ctx || document).querySelectorAll(sel));
function getImgs(layer) {
const imgs = $$('.layer-box img', layer);
return { left: imgs[0] || null, right: imgs[imgs.length - 1] || null };
}
function initLayer(layer) {
const panel = layer.querySelector('.toggle-text');
if (!panel) return;
// Start closed
panel.style.maxHeight = '0px';
panel.style.opacity = '0';
panel.style.overflow = 'hidden';
// Keep CSS transition list in sync with the stylesheet
panel.style.transition = 'max-height 300ms ease, opacity 300ms ease, padding 300ms ease';
panel.setAttribute('aria-hidden', 'true');
layer.setAttribute('aria-expanded', 'false');
// Track if we temporarily set a px max-height to animate from 'none'
panel._animating = false;
// Uncap at the end of open animation to avoid clipping on reflow/late loads
panel.addEventListener('transitionend', (e) => {
if (e.propertyName !== 'max-height') return;
const isOpen = layer.getAttribute('aria-expanded') === 'true';
if (isOpen) {
// Allow natural growth/shrink after opening
panel.style.maxHeight = 'none';
}
panel._animating = false;
});
// Keep max-height accurate while content changes (images, fonts, wraps)
if ('ResizeObserver' in window) {
const ro = new ResizeObserver(() => {
const isOpen = layer.getAttribute('aria-expanded') === 'true';
if (!isOpen) return;
// If we've uncapped, nothing to do; if we're mid-animation, keep px height in sync
if (panel.style.maxHeight !== 'none') {
panel.style.maxHeight = panel.scrollHeight + 'px';
}
});
ro.observe(panel);
panel._ro = ro;
}
// images: store original/alt sources
const { left, right } = getImgs(layer);
if (left && !left.dataset.origSrc) {
left.dataset.origSrc = left.getAttribute('src');
if (!left.dataset.graySrc && left.hasAttribute('data-gray-src')) {
left.dataset.graySrc = left.getAttribute('data-gray-src');
}
}
if (right && !right.dataset.origSrc) {
right.dataset.origSrc = right.getAttribute('src');
right.dataset.altSrc = right.getAttribute('data-alt-src') || GREEN_ARROW;
}
}
function openLayer(layer) {
const panel = layer.querySelector('.toggle-text');
if (!panel) return;
// Ensure we have a concrete height to animate from
if (panel.style.maxHeight === 'none') {
panel.style.maxHeight = panel.scrollHeight + 'px';
// force reflow
void panel.offsetHeight;
}
panel._animating = true;
panel.setAttribute('aria-hidden', 'false');
layer.setAttribute('aria-expanded', 'true');
panel.style.opacity = '1';
// Animate to content height
panel.style.maxHeight = panel.scrollHeight + 'px';
swapRightArrow(layer, true);
}
function closeLayer(layer) {
const panel = layer.querySelector('.toggle-text');
if (!panel) return;
panel._animating = true;
// If uncapped, set current height in px first so we can animate to 0
if (panel.style.maxHeight === 'none') {
panel.style.maxHeight = panel.scrollHeight + 'px';
// force reflow
void panel.offsetHeight;
}
panel.setAttribute('aria-hidden', 'true');
layer.setAttribute('aria-expanded', 'false');
panel.style.opacity = '0';
panel.style.maxHeight = '0px';
swapRightArrow(layer, false);
}
function swapRightArrow(layer, isOpen) {
const { right } = getImgs(layer);
if (!right) return;
const to = isOpen ? (right.dataset.altSrc) : (right.dataset.origSrc || right.src);
if (right.getAttribute('src') !== to) right.setAttribute('src', to);
}
function updateLeftIcons(state) {
state.layers.forEach(l => {
const { left } = getImgs(l);
if (!left) return;
const orig = left.dataset.origSrc || left.src;
const grey = left.dataset.graySrc || orig;
const target = (state.current && state.current !== l) ? grey : orig;
if (left.getAttribute('src') !== target) left.setAttribute('src', target);
});
}
function attachHandlers(layer, state) {
const openOnEnter = () => {
if (state.current === layer) return;
if (state.current) closeLayer(state.current);
openLayer(layer);
state.current = layer;
updateLeftIcons(state);
};
layer.addEventListener('mouseenter', openOnEnter);
layer.addEventListener('focusin', openOnEnter);
layer.addEventListener('touchstart', openOnEnter, { passive: true });
}
document.addEventListener('DOMContentLoaded', function () {
const layers = $$('.layers .layer');
if (!layers.length) return;
const state = { current: null, layers };
layers.forEach(layer => {
initLayer(layer);
attachHandlers(layer, state);
});
// Keep height correct if text re-wraps on resize
window.addEventListener('resize', function () {
if (!state.current) return;
const panel = state.current.querySelector('.toggle-text');
if (!panel) return;
if (panel.style.maxHeight === 'none') {
// natural flow is fine
return;
}
panel.style.maxHeight = panel.scrollHeight + 'px';
});
});
})();