strip_tags remove quitar para funcion etiquetas ejemplo php eval

php - remove - strip_tags wordpress



¿Cuándo(si alguna vez) es eval NO es malo? (15)

El principal problema con eval es que es una puerta de entrada para código malicioso. Por lo tanto, nunca debe usarlo en un contexto donde pueda ser explotado desde el exterior, por ejemplo, la entrada proporcionada por el usuario.

Un UseCase válido estaría en Mocking Frameworks.

Ejemplo de PHPUnit_Framework_TestCase::getMock()

// ... some code before $mock = PHPUnit_Framework_MockObject_Generator::generate( $originalClassName, $methods, $mockClassName, $callOriginalClone, $callAutoload ); if (!class_exists($mock[''mockClassName''], FALSE)) { eval($mock[''code'']); } // ... some code after

En realidad, suceden muchas cosas en el método generate. En términos de laymen: PHPUnit tomará los argumentos para generate y crear una plantilla de clase a partir de él. Luego evaluará esa plantilla de clase para que esté disponible para la creación de instancias. El objetivo de esto es tener TestDoubles para burlarse de dependencias en UnitTests, por supuesto.

Escuché en many places que la función de eval de PHP a menudo no es la respuesta . A la luz del LSB de PHP 5.3 y los closures nos estamos quedando sin motivos para depender de eval o create_function .

¿Hay algún caso concebible en que eval sea ​​la mejor (¿única?) Respuesta en PHP 5.3?

Esta pregunta no se trata de si eval es malvado en general, como obviamente no lo es.

Resumen de respuestas:

  • Evaluar expresiones numéricas (u otros subconjuntos "seguros" de PHP)
  • Examen de la unidad
  • PHP interactivo "shell"
  • Deserialización de var_export confiable
  • Algunos lenguajes de plantilla
  • Creación de puertas traseras para administradores y / o hackers
  • Compatibilidad con <PHP 5.3
  • Comprobando la sintaxis (posiblemente no sea seguro)

Este debate de evaluación es en realidad un gran malentendido en el contexto de php. Las personas son sometidas a un lavado de cerebro para que eval sean malvadas, pero por lo general no tienen problemas para usar include , aunque include es esencialmente lo mismo. Incluir foo es lo mismo que eval file_get_contents foo, por lo que cada vez que incluyas algo comprometes el pecado mortal de eval.


He descubierto que hay momentos en los que la mayoría de las características de un idioma son útiles. Después de todo, incluso GOTO ha tenido sus defensores . Eval se usa en varios marcos y se usa bien. Por ejemplo, CodeIgniter utiliza eval para distinguir entre la jerarquía de clases de las implementaciones PHP 4 y PHP 5. Los complementos de blog que permiten la ejecución del código PHP definitivamente lo necesitan (y esa es una característica disponible en Expression Engine, Wordpress y otros). También lo he usado para un sitio web donde una serie de vistas son casi idénticas, pero se necesitaba un código personalizado para cada una y la creación de algún tipo de motor de reglas loco era mucho más complicado y más lento.

Si bien sé que esto no es PHP, encontré que la evaluación de Python hace que la implementación de una calculadora básica sea mucho más simple.

Básicamente, aquí está la pregunta:

  1. ¿Eval facilita la lectura ? Uno de nuestros principales objetivos es comunicar a otros programadores lo que estaba pasando por nuestra cabeza cuando escribimos esto. En el ejemplo de CodeIgniter está muy claro lo que estaban tratando de lograr.
  2. ¿Hay otra manera? Lo más probable es que, si está utilizando eval (o variables variables, o cualquier otra forma de búsqueda de cadenas o sintaxis de reflexión), hay otra forma de hacerlo. ¿Has agotado tus otras opciones? ¿Tiene un conjunto de entrada razonablemente limitado? ¿Se puede usar una declaración de cambio?

Otras Consideraciones:

  1. ¿Se puede hacer seguro? ¿Hay alguna manera de que una pieza perdida de código pueda llegar a la declaración de evaluación?
  2. ¿Se puede hacer consistente? ¿Puede usted, dada una entrada, siempre y consistentemente producir el mismo resultado?

He usado eval cuando tuve un robot con motor de ph que se comunicó conmigo y pude decirle que hiciera comandos a través de EVAL: php commands here . Sigue siendo malo, pero si tu código no tiene idea de qué esperar (en caso de que extraigas un fragmento de código PHP de una base de datos) eval es la única solución.


No uso directo, pero el modificador / e para preg_replace utiliza eval y puede ser bastante útil. Vea el ejemplo # 4 en http://php.net/preg_replace .

Si es malo o malo es subjetivo y depende completamente de lo que consideras "bueno" en un contexto específico. Cuando se trata de entradas que no son de confianza, generalmente se considera malo. Sin embargo, en otras situaciones puede ser útil. Imagine escribir un script de conversión de datos por única vez bajo una presión límite extrema. En esta situación, si eval funciona y facilita las cosas, tendría problemas para llamarlo malvado.


Por lo tanto, esto debería ser cierto para todos los idiomas con eval :

Básicamente, con pocas excepciones, si está creando el valor pasado a eval o obteniéndolo de una fuente no probada, está haciendo algo mal. Lo mismo ocurre si llamas a eval en una cadena estática.

Más allá de los problemas de rendimiento con la inicialización del analizador en tiempo de ejecución y los problemas de seguridad, generalmente se confunde con el sistema de tipos.

Más en serio, se acaba de demostrar que en la gran mayoría de los casos, existen enfoques mucho más elegantes para la solución. Sin embargo, en lugar de prohibir completamente el constructo, es bueno pensarlo como uno podría goto . Existen usos legítimos para ambos, pero es una buena señal de alerta que debería hacerte pensar si estás abordando el problema de la manera correcta.

Según mi experiencia, solo he encontrado usos legítimos que pertenecen a las categorías de complementos y usuarios con privilegios (por ejemplo, el administrador de un sitio web, no el usuario de tales) extensiones. Básicamente cosas que actúan como código proveniente de fuentes confiables.


Puede usar eval para crear clases ad-hoc:

function myAutoLoad($sClassName){ # classic part if (file_exists($sClassName.''.php''){ require $sClassName.''.php''; } else { eval(" class $sClassName{ public function __call($sMethod,$aArgs){ return ''No such class: '' . $sClassName; } }"); } }

Aunque, por supuesto, el uso es bastante limitado (algunos API o tal vez contenedores DI, marcos de prueba, ORM que tienen que tratar con bases de datos con estructura dinámica, parques de juegos de código)


Puede usar eval para crear una configuración para agregar código después de instalar el sistema. Normalmente, si desea cambiar el código en el servidor, deberá agregar / cambiar los archivos PHP existentes. Una alternativa a esto sería almacenar el código en una base de datos y usar eval para ejecutarlo. Sin embargo, debes estar seguro de que el código agregado es seguro.

Piense en ello como un complemento, solo uno que puede hacer cualquier cosa ...

Podría pensar en un sitio que permita a las personas contribuir con fragmentos de código que los usuarios podrían agregar dinámicamente a sus páginas web, sin que en realidad persistan en el sistema de archivos del servidor web. Lo que necesitarías es un proceso de aprobación, aunque ...


Si está escribiendo malware y quiere hacer la vida más difícil para el administrador del sistema que está tratando de limpiar después de usted. Ese parece ser el caso de uso más común en mi experiencia.


Si está escribiendo un sitio que interpreta y ejecuta código PHP, lo haría como un shell interactivo.

...

Soy un chico de sistemas, eso es todo lo que tengo.


Supongo que eval debe usarse donde el código realmente necesita ser compilado . Me refiero a casos como compilaciones de archivos de plantilla (lenguaje de plantilla en PHP por el bien del rendimiento), compilación de gancho de complemento, compilaciones por razones de rendimiento, etc.


Una ocasión apropiada (dada la falta de alternativas fáciles) sería cuando los datos confiables se serializaron con var_export y es necesario deserializarlos. Por supuesto, nunca debería haber sido serializado de esa manera, pero a veces el error ya está hecho.


Eric Lippert suma más de tres publicaciones de blog. Es una lectura muy interesante.

Por lo que sé, las siguientes son algunas de las únicas razones por las que eval se usa.

Por ejemplo, cuando construye expresiones matemáticas complejas basadas en la entrada del usuario, o cuando está serializando el estado del objeto en una cadena para que pueda ser almacenada o transmitida, y reconstituida posteriormente.


eval es una construcción que se puede usar para verificar errores de sintaxis.

Digamos que tienes estos dos scripts PHP:

script1.php

<?php // This is a valid syntax $a = 1;

script2.php

<?php // This is an invalid syntax $a = abcdef

Puede verificar errores de sintaxis usando eval :

$code1 = ''return true; ?>''.file_get_contents(''script1.php''); $code2 = ''return true; ?>''.file_get_contents(''script2.php''); echo eval($code1) ? ''script1 has valid syntax'' : ''script1 has syntax errors''; echo eval($code2) ? ''script2 has valid syntax'' : ''script2 has syntax errors'';

A diferencia de php_check_syntax (que está en desuso y eliminado de todos modos), el código no se ejecutará.

EDITAR:

La otra alternativa (preferida) es php -l . Puede usar la solución anterior si no tiene acceso a los comandos de ejecución del sistema () o shell.

Este método puede inyectar clases / funciones en tu código. Asegúrese de aplicar una llamada preg_replace o un namespace antes de hacerlo, para evitar que se ejecuten en llamadas posteriores.

En cuanto al tema OP: ¿ Cuándo (si alguna vez) es eval NO mal? eval es simplemente malvado. Los programadores son malvados por usar eval sin ninguna razón. eval puede acortar su código (evaluación de expresión matemática, por ejemplo).


Compatibilidad Es bastante frecuente proporcionar respaldos de PHP4. Pero también es posible querer emular la funcionalidad de PHP5.4 en 5.3, como SplString . Si bien la simple inclusión de dos variantes de inclusión (include.php4 vs. include.php5) es frecuente, a veces es más eficiente o legible recurrir a eval ():

$IMPL_AA = PHP_VERSION >= 5 ? "implements ArrayAccess" : ""; eval(<<<END class BaseFeature $IMPL_AA {

En este caso, el código funcionaría en PHP4, pero expondría la API / sintaxis más agradable solo en PHP5. Tenga en cuenta que el ejemplo es ficticio.