He visto muchas veces a personas que dicen que no deben usar filtros PHP / PHP personalizados (desde la interfaz de usuario de Drupal) en bloques, nodos, vistas-argumentos, reglas, etc. He buscado un poco y no he encontrado mucho, parece que Esta es una mejor práctica de Drupal que todos "solo saben".
Entiendo que representa un riesgo de seguridad potencial, especialmente en manos de usuarios finales o personas nuevas en Drupal o PHP, pero como desarrollador / creador de sitios, ¿cuáles son las razones reales para no usar PHP personalizado desde la interfaz de usuario de Drupal?
Respuestas:
Algunos motivos:
Puede haber más razones, pero eso debería ser suficiente :)
fuente
require_once $_SERVER['DOCUMENT_ROOT'].'/sites/all/themes/myTheme/php/stuff.php';
y escribir el resto del código en su IDE / editor de texto. A veces no es un trabajo fácil o llevaría mucho tiempo crear un módulo propio, incluso como un buen desarrollador de PHP. Un breve ejemplo: acciones condicionales de Ubercart. Pero es cierto que no es bueno mantener nuestro código en db.Este código es difícil de depurar y mantener. No conozco ninguna forma de usar el control de versiones para ese tipo de código php.
Y es realmente un riesgo potencial de seguridad para las personas nuevas en Drupal o PHP,
fuente
Considerando el caso del filtro PHP utilizado en un nodo, la razón para no usarlo es que limita los usuarios que pueden editar ese nodo, si no desea permitir que todos los usuarios usen el filtro PHP.
En lugar de usar el filtro PHP, es mejor usar un módulo personalizado que reemplace el texto específico en el contenido del nodo con el resultado del código que ejecuta (sin usar
eval()
), o que agregue su propio texto al contenido del cuerpo de los nodos. En este caso, cualquier usuario podría editar el nodo, sin tener el permiso para agregar código PHP arbitrario que luego es ejecutado por el filtro PHP.En general, es mejor evitarlo
eval()
porque disminuye la legibilidad del código, la capacidad de predecir la ruta del código (y las posibles implicaciones de seguridad) antes del tiempo de ejecución y, por lo tanto, la capacidad de depurar el código.Aparte de un sitio de desarrollo o prueba, no habilitaría el filtro PHP ni usaría el código PHP que se pasa
eval()
.El filtro PHP se ha eliminado de Drupal 8. Ahora es un módulo de terceros , no cubierto por la política de asesoramiento de seguridad . Esta es probablemente una razón más para no usarlo en servidores de producción (si las razones ya mencionadas no lo convencieron).
fuente
Como solución para los diversos problemas especificados anteriormente: dificultad de mantenimiento del código, control de versiones, búsqueda de errores, tiene esta posibilidad ligeramente "klugey":
Cree funciones (nómbrelas cuidadosamente, de acuerdo con lo que hacen) en un archivo que siempre se incluye; si tiene un módulo personalizado que está escribiendo para el sitio, es un excelente lugar para colocar estas funciones. El php que ingrese es simplemente:
return my_specialfunc($somevar);
-$somevar
aquí podría ser el objeto del nodo en el que se trabajó, o cualquier otra variable relevante aquí.Creo que todavía quiero la flexibilidad, en algunos lugares, de llamar a mi propio código. Al usar esta técnica, mantener el código es fácil, ya que se trata simplemente de modificar la función en el archivo. La detección de errores es fácil ya que la función se mostrará en una traza inversa.
Tenga en cuenta, sin embargo, que esto no resuelve los posibles problemas de seguridad. Estos dependen en gran medida de la seguridad del núcleo de Drupal. En general, el código contenido en la base de datos es a menudo un gran obstáculo para la seguridad: las funcionalidades que utilizan el código contenido en la base de datos tienden a ser mucho más propensas a la explotación, y la seguridad a su alrededor debe ser más estricta. Sin embargo, Drupal en general ha sido bastante bueno para mantener la seguridad de estos problemas: han surgido y luego se han parcheado / resuelto rápidamente con nuevas versiones.
fuente
Aquí está la razón de vulnerabilidad de seguridad para evitar dar este permiso a sus usuarios si no desea que sus usuarios no administradores modifiquen la base de datos directamente.
Hackear las credenciales de Drupal db
fuente
En lugar de hacer algo como
return functionname($object)
, sería mejor usar el sistema de tokens / filtros en la medida de lo posible. Hay módulos como Insert View View e Embed Node que pueden ayudar con circunstancias comunes en las que las personas desearían incrustar PHP en los nodos o cuerpos de bloque.fuente
Debería preocuparse por la portabilidad de sus datos. ¿Qué sucede si migra sus nodos de drupal 7 a drupal 8 y el texto del cuerpo de algunos nodos tiene
<?php whatever_function_that_does_not_exist_anymore(); ?>
?No piense en su proyecto dentro de los 5 meses, sino dentro de los 5 años. Las actualizaciones, las buenas prácticas y la portabilidad son aspectos importantes de cualquier buen proyecto de TI en mi opinión.
Usar los módulos menos contribuidos posibles es también un aspecto de esto.
fuente