CLICKJACKING EN PHP: QUÉ ES Y CÓMO PREVENIRLO
Clickjacking es una técnica maliciosa utilizada por atacantes para engañar a los usuarios de una página web, haciéndoles clic en algo diferente a lo que creen que están seleccionando. Esto se logra superponiendo elementos invisibles o engañosos sobre una página web legítima, de modo que el usuario, al hacer clic, realiza una acción no deseada, como: Hacer clic en un botón oculto que ejecuta una acción maliciosa (por ejemplo, descargar malware, aceptar permisos, o realizar transacciones no autorizadas) o interactuar con un elemento de una página diferente a la que el usuario ve, como un iframe transparente superpuesto.Cómo funciona
- Superposición engañosa: El atacante crea una página web o inserta un iframe que carga una página legítima, pero la oculta o la cubre con elementos invisibles (por ejemplo, usando CSS con opacidad 0).
- Engaño visual: El usuario ve una interfaz que parece inofensiva (como un botón de "Jugar" o "Descargar"), pero en realidad está interactuando con un elemento oculto de la página subyacente.
- Acción no deseada: Al hacer clic, el usuario puede, sin saberlo, autorizar pagos, compartir información personal, o activar configuraciones en una red social o sitio web.
Para evitar el clickjacking en php en una aplicación web desarrollada en php, se puede implementar varias medidas de seguridad que protejan tu sitio de ser cargado en iframes maliciosos o de realizar acciones no deseadas. A continuación, se detallan las estrategias más efectivas con ejemplos en php:
- Usar el encabezado X-Frame-Options: El encabezado HTTP X-Frame-Options indica si una página puede ser cargada dentro de un iframe, frame u object. Configurarlo correctamente es una de las formas más efectivas de prevenir clickjacking.Opciones de X-Frame-Options:
- DENY: Impide que la página se cargue en cualquier iframe.
- SAMEORIGIN: Permite que la página se cargue en un iframe solo si el sitio que lo contiene es del mismo origen (dominio).
- ALLOW-FROM uri: Permite que la página se cargue en un iframe solo desde un dominio específico (menos común y no soportado por todos los navegadores).
// Configurar el encabezado X-Frame-Options
header('X-Frame-Options: DENY');
// O usa SAMEORIGIN si necesitas permitir iframes del mismo dominio
// header('X-Frame-Options: SAMEORIGIN');
- Implementar Content Security Policy (CSP): El encabezado Content Security Policy (CSP) permite controlar desde qué dominios se pueden cargar recursos, incluyendo iframes. Puedes usar la directiva frame-ancestors para restringir quién puede incrustar tu página. CSP es más flexible que X-Frame-Options, pero requiere configuraciones más específicas.
// Configurar CSP para restringir iframes
header("Content-Security-Policy: frame-ancestors 'self'");
// 'self' permite solo el mismo origen. Puedes añadir dominios específicos, por ejemplo:
// header("Content-Security-Policy: frame-ancestors 'self' https://example.com");
- Usar 'self' para permitir solo el mismo dominio.
- Especificar dominios confiables si necesitas permitir iframes desde otros sitios (por ejemplo, https://example.com).
- Si no se desea permitir ningún iframe, usa 'none' en lugar de 'self'.
- DENY: Impide que la página se cargue en cualquier iframe.
- SAMEORIGIN: Permite que la página se cargue en un iframe solo si el sitio que lo contiene es del mismo origen (dominio).
- ALLOW-FROM uri: Permite que la página se cargue en un iframe solo desde un dominio específico (menos común y no soportado por todos los navegadores).
// Configurar el encabezado X-Frame-Options
header('X-Frame-Options: DENY');
// O usa SAMEORIGIN si necesitas permitir iframes del mismo dominio
// header('X-Frame-Options: SAMEORIGIN');
// Configurar CSP para restringir iframes
header("Content-Security-Policy: frame-ancestors 'self'");
// 'self' permite solo el mismo origen. Puedes añadir dominios específicos, por ejemplo:
// header("Content-Security-Policy: frame-ancestors 'self' https://example.com");
- Usar 'self' para permitir solo el mismo dominio.
- Especificar dominios confiables si necesitas permitir iframes desde otros sitios (por ejemplo, https://example.com).
- Si no se desea permitir ningún iframe, usa 'none' en lugar de 'self'.