labconker.com

Desarrollo Web – Programación -Wordpress

Eval() en PHP: el arma de doble filo que aún asusta a los desarrolladores

eval-php.png

Cuando hablamos de funciones peligrosas en PHP, eval() encabeza la lista. Muchos la conocen, pocos la entienden a fondo, y los que la han sufrido… jamás la vuelven a usar.

Este artículo no es otro aburrido manual. Aquí vas a descubrir qué hace eval(), por qué es tan polémica, los riesgos reales de seguridad que implica, y cómo fue usada en ataques reales que comprometieron miles de sitios web. Si te interesa proteger tu código y entender el lado oscuro del desarrollo PHP, sigue leyendo.

¿Qué es eval() en PHP?

La función eval() ejecuta código PHP que es pasado como una cadena de texto. Así de simple… y así de peligroso.


$code = 'echo "Hola mundo";';
eval($code); // Ejecuta la cadena como código PHP
  

A primera vista parece útil. ¿Quieres construir código dinámicamente? Evalúa una cadena. ¿Quieres interpretar código desde una base de datos o una API? Evalúa el contenido.

Pero aquí viene el gran «pero»

¿Por qué el uso de eval() es tan polémico?

Porque le abre la puerta al infierno. Así de claro.

El problema central es este: eval() ejecuta cualquier cosa que le pases. Si esa cadena viene de una fuente externa (un usuario, un archivo, una API sin validar), acabas de invitar al atacante a hacer lo que quiera en tu servidor.

  • Leer archivos sensibles (/etc/passwd, wp-config.php)
  • Inyectar shell reversas
  • Eliminar bases de datos
  • Instalar backdoors invisibles

Y lo peor: lo puede hacer sin que te des cuenta.

¿Por qué eval() es tan peligroso?


eval(base64_decode('ZWNobyAiSGFja2VkISI7')); // Ejecuta: echo "Hacked!";
  

Ejemplo:
Este código decodifica una cadena base64 y ejecuta su contenido como PHP. Es una técnica común para ocultar malware. En este caso, mostrará «Hacked!» en pantalla, pero en un caso real podría insertar una puerta trasera o borrar datos.

Aquí van razones concretas y sin tecnicismos:

  1. Ejecución arbitraria de código
    Si alguien puede controlar el contenido de lo que evalúas, te controla a ti. Así de simple.
  2. Bypassea validaciones
    Puedes tener filtros, sanitizaciones, firewalls… pero si eval() está mal usado, todo eso es papel mojado.
  3. Difícil de depurar
    ¿Dónde está el bug? ¿En la cadena? ¿En el código dinámico? ¿En una variable que se evalúa sola? Buena suerte.
  4. Ideal para malware
    Los atacantes adoran eval() porque pueden ofuscar código, inyectar payloads y esconderse en medio de un WordPress infectado.

Eval y malware: historia real de un ataque famoso

Uno de los casos más sonados ocurrió en 2013 con el malware SoakSoak, que afectó a más de 100.000 sitios WordPress. ¿La clave? El uso masivo de eval().

El atacante aprovechó una vulnerabilidad en un plugin popular para inyectar código PHP malicioso. Este código se escondía detrás de funciones eval(base64_decode(...)), lo que lo hacía casi invisible a simple vista.

¿Cómo se descubrió?

El tráfico anómalo de algunos sitios llevó a expertos de seguridad a investigar el código fuente. Encontraron archivos como functions.php y wp-config.php modificados con payloads ocultos en cadenas eval().

Desde entonces, muchos escáneres de seguridad marcaron cualquier uso de eval() como un red flag inmediato.

Alternativas seguras a eval()

Si estás tentado a usar eval() para algo «dinámico», respira hondo. Hay opciones mejores:

  • Funciones anónimas (closures) para lógica dinámica.
  • call_user_func() o call_user_func_array() para llamadas a funciones.
  • Incluir archivos con include o require en lugar de ejecutar cadenas.
  • Plantillas con motores como Twig o Blade en vez de armar código con variables.

Conclusión: evita eval() como si fuera fuego

No importa si eres novato o experto. Si ves eval() en un plugin, una plantilla o tu propio código, haz una pausa y piénsalo dos veces.

  • ¿De verdad lo necesitas?
  • ¿Puedes hacerlo de otra forma?
  • ¿Estás validando y sanitizando TODO lo que evalúas?

En seguridad, lo que no se ve es lo que más daño hace. Y eval() es el perfecto ejemplo de cómo algo tan simple puede volverse letal.

Bonus SEO: preguntas frecuentes sobre eval() en PHP

¿Eval() es inseguro siempre?
Sí, salvo que controles al 100% el contenido de la cadena. Pero incluso así, hay mejores formas de hacer lo mismo.

¿Eval() se sigue usando en PHP moderno?
Cada vez menos. PHP 8 y frameworks modernos como Laravel lo evitan completamente.

¿Cómo detectar eval() en mi sitio WordPress?
Busca eval( en los archivos PHP. Si lo ves combinado con base64_decode(), alerta máxima.

Última recomendación

Si te preocupa la seguridad de tu sitio WordPress, evalúa tu código, no con eval(), sino con sentido común.
Y si ves esa función en algún plugin gratuito… huye.

Debes estar conectado para publicar un comentario.