Pregunta

Estoy trabajando en un proyecto php y quiero ejecutar el código que se obtiene de una base de datos MySQL. No hay posibilidad de que se inyecte código inseguro, por lo que lo único que me preocupa es el rendimiento. ¿Debo usar eval () para poder ejecutar el código directamente o analizarlo para que call_user_func () lo ejecute en su lugar?

Por ejemplo, si el código que obtuve fue " myfunc (1,2,3); anotherFunc (3,2,1); "
Puedo evaluarlo () directamente para ejecutar el código.

Pero para call_user_func (), tendría que analizar la cadena para que pueda ejecutarse. Entonces, ¿cuál es la mejor función para usar en este caso?

¿Fue útil?

Solución

Como regla general, siempre trato de mantenerme lo más alejado posible de eval (). Este caso, sin embargo, parece un buen candidato para él.

Usted dice " No hay posibilidad de que se inyecte código inseguro " , por lo que la gran pregunta es: ¿existe la posibilidad de que el código no funcione en la base de datos? / p>

Si no, eval () es la solución, pero si hay un análisis adecuado y un registro de errores / etc. podría ser una apuesta más segura. (creo que usar call_user_func_array () es más rápido en teoría, por lo que cualquier sobrecarga de análisis podría ser insignificante)

Otros consejos

Almacenar PHP en la base de datos es un mal olor de diseño en sí mismo; Aunque en este caso está bastante seguro de que nunca puede contener código inseguro, siempre es bueno minimizar la cantidad de suposiciones o defensas como esa que tiene que hacer. Si almacena código PHP en la base de datos, entonces un ataque en el que un atacante obtiene acceso a su base de datos rápidamente se vuelve mucho más serio, ¡convirtiéndose en un ataque en el que un atacante puede ejecutar código arbitrario! Sé que comprometer su base de datos de esta manera es muy poco probable, pero no obstante, es una buena práctica de seguridad no permitir que incluso una situación poco probable comprometa su sistema más de lo necesario.

Muchas personas están de acuerdo en que evalúa () siempre, sin excepción, debe evitarse en el código PHP. Siempre hay una alternativa.

En este caso, sin embargo, creo que tendría que decir que usar eval () sería la mejor solución para usted, porque ya está almacenando código PHP en la base de datos, por lo que usar eval () no va a aumentar su riesgo más allá de eso.

Sin embargo, recomendaría que

  1. Intentas validar el código antes de evaluarlo () siendo conservador en lo que permites. Suponga que de alguna manera un atacante ingresó a su base de datos, incluso aunque eso sea poco probable.
  2. Al menos piensa seriamente en reescribir su aplicación para que el código PHP no se almacene en una base de datos. Si está almacenando estructuras de datos complejas, piense en algo como JSON o incluso XML. Existen analizadores seguros para estos.

Lo siento si esta respuesta parece un poco reaccionaria; Simplemente siento que este tipo de cosas es muy importante.

Creo que el análisis agregaría una sobrecarga, pero la única forma en que puede estar seguro es ejecutar pruebas. Pruébelo en ambos sentidos con varias funciones y vea cuáles son sus resultados. Use código que represente lo que espera almacenar.

¡Buena suerte!

Utilice eval (). Cualquier otra cosa no merece la pena: no tendrían ningún efecto secundario positivo.

Es posible que desee echar un vistazo a la extensión runkit , que puede ejecutar php en un sandbox que no afecta El código de ejecución.

Si se supone que el código afecta su código en ejecución, vaya a eval ().

También debe ajustar el código que está a punto de ejecutar en un bloque try / catch, en caso de que haya un error (aunque haya dicho que no lo habrá, existe la posibilidad, y es la mejor práctica)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top