CGIBASHOPTS: opciones de bash CGI analizando
CGIBASHOPTS es una biblioteca bash pura pequeña y rápida para analizar los parámetros de formularios web para scripts CGI web de Bash Shell, incluso con cargas de archivos binarios. Es gratuito de usar sin restricciones (licencia MIT). (c) Colas Nahaboo 2017
Inicio rápido
- Copie el archivo
cgibashopts en algún lugar de su servidor. Por ejemplo, AS /usr/local/bin/cgibashopts - Simplemente obtenga este archivo al comienzo de sus scripts Bash CGI. Por ejemplo:
source /usr/local/bin/cgibashopts o . /usr/local/bin/cgibashopts - El valor de un parámetro de formulario web
foo (por ejemplo, en la página HTML: <input type=text name=foo> ) se puede encontrar como el valor de la variable de entorno de shell $FORM_foo
Solución de problemas:
- Si algo sale mal, ejecute
tests/tewiba -v en el directorio CGIBASHOPTS en su servidor para ver si la suite de prueba detecta un problema. - CGIBASHOPTS requiere las versiones GNU de
bash , grep , sed . Para probar esto, ejecute grep -P . /dev/null , no debe recibir un error. Si lo hace, debe instalarlos en sistemas similares a Unix que no usen las utilidades de GNU de forma predeterminada, como MacOS , BusyBox, FreeBSD, BSD y Derivados SYSV ...- En MacOS, ver el tema #10
- En BusyBox debe instalar los paquetes para las versiones GNU de
bash , coreutils , grep , sed - En FreeBSD, use Freshports
Características
- Sencillo de usar: solo un archivo.
- Rápido y pequeño.
- Bash puro, excepto por el uso de GREP, SED y truncado.
- Manejas las solicitudes Get and Post, con todos los métodos para codificar los parámetros: aplicación/x-www-form-urlencoded, multipart/form-data, texto/simple.
- Maneja también las cadenas de consulta de búsqueda de índice heredado
- Maneja la carga de archivos binarios y archivos de texto con UNIX o DOS NewLines. No encontré ninguna biblioteca existente que proporcionara esta funcionalidad para la programación de shell CGI
- Utiliza solo características "clásicas" de Bash, y debería funcionar con versiones de Old Bash, supongo que 4.1+
Documentación
- Cuando se usa, la biblioteca CGIBASHOPTS decodifica los parámetros enviados por el navegador que el servidor web proporciona a los scripts como varias variables de entorno y opcionalmente su entrada estándar, según el estándar CGI. CGIBASHOPTS los pone a disposición del script que incluye una forma fácil de usar: variables, funciones y archivos.
- Para usar la biblioteca, obtenga al comienzo de su script, lo antes posible para evitar conflictos con variables que pueda usar más adelante en su script.
- La biblioteca decodifica los parámetros de las solicitudes de Get and Post, con todas las formas posibles de codificar los parámetros (a través de "Enctype").
- La lista de nombres de parámetros se enumera en
$FORMS como una cadena de nombres separada por espacios. Por ejemplo: echo "$FORMS" ==> foo bar gee . Los nombres de parámetros son el especificado por el atributo name en los diversos elementos HTML en un formulario HTML, o enviados a través de comandos como wget o curl . Los nombres de los parámetros deben ser nombres de variables legales para bash: caracteres alfanuméricos y subrayadores, y no comenzar por un dígito. - Los nombres de parámetros no válidos (por ejemplo: 0to60, ab, a: b, ...) se ignoran en silencio, así como sus valores
- Cada valor del parámetro se copia como el valor de una variable de entorno prefijo Form_. Por ejemplo:
$FORM_foo para un elemento de formulario HTML llamado foo . - Los valores de los parámetros de múltiples líneas se convierten en el final de las líneas UNIX (una nueva línea en lugar de retorno de carro y nueva línea)
- Suben los archivos: cuando los archivos se cargan, a través de elementos de formulario como
<input type=file name=file1> , cgibashopts coloca el nombre del parámetro (aquí file1 ) en la variable $ formfiles, que es una lista separada por el espacio de todos los nombres de parámetros de archivo recibidos. El nombre real del archivo cargado se puede encontrar en el valor variable (aquí $FORM_file1 ), mientras que el contenido del archivo se puede encontrar en un archivo local nombrado por la variable en el directorio $CGIBASHOPTS_DIR , (aquí $CGIBASHOPTS_DIR/file1 )- Solo en realidad los archivos cargados se crean y enumeran de esta manera. Si el usuario no selecciona ningún archivo en el formulario, la variable Shell no se definirá ni se creará ningún archivo creado.
- Sin embargo, se crearán archivos cargados vacíos. Estarán vacíos, por supuesto.
- Los archivos binarios y de texto recibidos no se convertirán en el formato de texto UNIX (las líneas terminan con una nueva línea), incluso si el cliente los cargó en un formato DOS (las líneas terminan con un retorno de carro y una nueva línea). Por lo tanto, debe estar listo para manejar las líneas DOS en los archivos de texto cargados.
- ADVERTENCIA: Se debe llamar a una función de limpieza de bash
cgibashopts_clean al final de su script para eliminar el directorio temporal $CGIBASHOPTS_DIR almacenando los archivos cargados, si no se usa la opción -n (ver más abajo). CGIBASHOPTS hace una trap cgibashopts_clean 0 para que esta función se llame automáticamente al final de su secuencia de comandos, por lo que no tiene que hacer nada, a menos que use una trap 0 usted mismo y, por lo tanto, debe asegurarse de que su código que maneja la señal de salida llame explícitamente cgibashopts_clean .- El abastecimiento de CGIBASHOPTS borrará cualquier
trap 0 que se haya realizado anteriormente. Entonces, configure su trampa 0 después de obtener cgibashopts - Llamar a CGIBASHOPTS_CLEAN solo se necesita solo si su formulario HTML usa elementos de entrada de tipo
file - Tan pronto como haya procesado los archivos cargados, puede llamar explícitamente la función
cgibashopts_clean usted mismo, para que ya no sea necesario y que sea libre de usar trampas como desee después. - Si no espera que se carguen archivos, puede usar la opción -n (ver más abajo)
- Opciones de línea de comando:
- -N se puede dar para ignorar y descartar cualquier solicitud para cargar archivos. Esto se recomienda si no espera que se carguen los archivos, ya que puede guardar alguna carga informática si algún atacante intenta cargar archivos falsos, pero no es obligatorio. Tampoco define la variable
$CGIBASHOPTS_DIR ni la función cgibashopts_clean , y no usa TRAP. Nota: Esto solo está disponible en las versiones 3 y superiores. Ejemplo de uso : . cgibashopts -n - -d El directorio especifica dónde CGIBASHOPTIONS administrará sus archivos temporales en caso de cargas de archivos. El valor predeterminado es
/tmp . CGIBASHOPTions creará $$ él un subdirectorio cgibashopts-files.$$ $CGIBASHOPTS_DIR
- La variable
CGIBASHOPTS_RELEASE contiene la versión de lanzamiento, utiliza versiones semánticas (por ejemplo, 4.0.1, 4.4.3) de la libría CGIBASHOPTS utilizada, y las versiones se enumeran al final de esta página en la historia de los cambios ...- La variable
CGIBASHOPTS_VERSION contiene el número de versión principal (el primer número entero de CGIBASHOPTS_RELEASE anterior, para la compatibilidad hacia atrás.
- Miserables golosinas:
- Se proporcionan dos funciones de Bash prácticas:
-
urldecode que toma una cadena en el parámetro y genera su versión decodificada, transformando + en espacios y %XX en el carácter del código ASCII hexadecimal xx (por ejemplo, %41 se convierte en a), y eliminar los retornos del carro. -
urlencode que realiza la operación inversa. Ambos son más rápidos que los comandos binarios de Linux.
- Dos variables
$nl y $cr tienen una nueva línea y un carácter de retorno de carro - Una forma alternativa de obtener los valores de las variables es a través de la función
param . Esta es solo una función de conveniencia compatible con Bashlib para personas (o scripts) que se usan.-
param sin emergencias de argumento el valor de FORMS -
param foo sale el valor de FORM_foo -
param foo a string... establece el valor de FORM_foo a "a string..." -
param -f imprime $FORMFILES -
param -f foo imprime $FORMFILE_foo -
param -f foo a string... establece el valor de FORMFILE_foo a "a string..."
Suite de prueba
Se proporciona un suite de prueba, puede ser ejecutado por ./tests/RUN-ALL-TESTS , para más detalles consulte el readme.md en tests de directorio
Proyectos que lo usan
- WaterMark-PDF Un interfaz web para un script de marca de agua PDF por Pipoprods
- Buscar en todos los proyectos de Github para referencia
Comentario
Siéntase bienvenido a copiar y mejorar este proyecto, así como proporcionar informes de errores, comentarios, sugerencias a través de:
- Creando problemas, si tiene una cuenta de GitHub.
- Use el formulario de informe GIT proporcionado para crear un problema si no tiene una cuenta GitHIB.
- Crear o participar en una discusión sobre este proyecto
- O simplemente envíeme un correo electrónico: [email protected]
Historia de los cambios
- 2023-01-11 V4.1.3: Soluciones para la suite de prueba solo para evitar errores en las versiones bash <4.4. El código real de CGIBASHOPTS no cambia, no es necesario actualizar a menos que pase el conjunto de pruebas en sistemas heredados.
- 2023-01-08 V4.1.2: corrección de errores: solo los semicolones se entendieron como separadores en los encabezados HTTP
Content-Type y Content-Disposition . Fijo para usar también comas. Error reportado por "Florin-CTU", números #8 y #9. - 2022-11-24 V4.1.1: corrección de errores: campos de formulario después de que se ignoró un campo de carga de archivo. ¡Actualice! Informe de errores de "Pipoprods", problema #7.
- 2021-12-23 V4.1.0:
- cambiado a versiones semánticas, con nuevo var
CGIBASHOPTS_RELEASE - nueva opción -d para especificar el directorio temporal (sugerencia de "Aufschlauer")
- Mover a GitHub: movió la mayoría de los archivos fuera de la vista principal, en las pruebas/, TEWIBA actualizado a 1.5.0, Código de limpieza para pasar SheLcheck
- 2020-04-16 Versión 4: Función de regalos de Urlencode agregado
- 2020-04-04 Algunos cambios cosméticos en este DOC y las pruebas (DIR de suite de prueba renombrado como pruebas), pero no hay cambios en el código CGIBASHOPTS en sí, por lo que no aumentará el número de versión.
- 2020-03-27 versión 3: -n opción agregada para deshabilitar las cargas de archivos
- 2018-10-09 Versión 2: Fix, los espacios en los valores de los parámetros podrían verse como +
- 2017-12-13 Versión 1: correcciones para cargar archivos con varios tipos mime, la biblioteca ahora se puede usar en scripts usando set -u y set -e.
- 2017-12-07 Creación del proyecto