|
|
1. ¿Qué es CGI?
2. Requisitos para correr programas ó script CGI
3. Mecanismo de Comunicación entre el Programa CGI y el Servidor
4. Tipo de Comunicación entre el Servidor y el Programa ó Script CGI
5. Seguridad en los programas ó scripts CGI
6. Consideraciones
entre CGI y SSI
CGI (Common
Gateway Interface), Es un método estándar (común)
de comunicación (interfaz) entre diferentes procesos
(tipos de gateway). CGI no es
un lenguaje, es un protocolo estándar mediante el cual, un
servidor Web puede obtener
data de (ó enviar data a ) las bases
de datos, documentos ó a otros programas y presentar esa misma data
a los usuarios
a través de la Web. Un Script ó
programa CGI puede ser escrito en cualquier lenguaje que pueda leer STDIN,
escribir
en STDOUT y leer Variables de Entorno.
La estructura ó secuencia típica de un Script ó programa CGI es la siguiente:
a) Leer la forma de entrada del usuario
b) Hacer la manipulación de
la data necesaria
c) Escribir la respuesta a STDOUT
Como podrás
ver, esta es la secuencia lógica de cualquier programa en cualquier
lenguaje de programación; pero, una
diferencia importante entre un programa
común y un Script ó programa de CGI es que los Scripts CGI
usualmente generan
una página WEB como respuesta.
Una de las
principales razones (ó podemos decir la razón más
importante) por la cual los programadores de páginas Web
usan los Scripts CGI es definitivamente
para aumentar el contenido de las páginas Web muy por encima de
lo que el
simple HTML puede proveer, Básicamente
una página Web que contenga una forma necesita un Script
CGI para procesar
las entradas de la forma. El Script
CGI es entonces ejecutado en tiempo real, de forma tal que puede
procesar la
información del usuario y genera
como salida la información dinámica requerida. Desde formas
de correo y programas que
lleven contadores de visitantes hasta los
más complejos programas de base de datos que generan complejos sitios
Web al
momento, los Scripts CGI proporcionan un
amplio espectro de contenido en la Web Hoy.
Los CGI Scripts
son una herramienta esencial para crear y manejar sitios web dinámicos
y comprensibles. Con CGI Scripts
Ud. Puede crear aplicaciones que respondan
según las selecciones y/o respuestas de sus usuarios.
La mayoría
de las Compañías proveedoras de Servicios de Internet (ISP),
soportan el uso de Scripts CGI. Una de las
principales cosas que debemos considerar
al momento de seleccionar un proveedor de servicios de Internet es lo siguiente:
a) ¿Tengo la capacidad de correr mis
propios Scripts CGI?
b) ¿Mi capacidad de correr
Scripts CGI incluye soporte por SSI (Server-Sides Includes (comandos que
permiten incluir
en una página
Web información que el Web server tiene ó puede generar)
?
Si la respuesta
a estas dos preguntas es afirmativa, entonces los requisitos que yo debo
amarrar para poder correr un
Script de CGI son los siguientes:
a) Gestionar con el administrador del
servidor Web el acceso al directorio CGI-BIN. En este directorio deben
resider todos
tus programas CGI.
b) Transferir los Scripts CGI al directorio
CGI-BIN (Hacer la transferencia siempre en modo ASCII ) y otorgarle a los
mismos los permisos
requeridos para que puedan ser ejecutados por cualquier persona que esté
ejecutando ésa página Web
(usualmente estos archivos
tienen extensión * .cgi).
c) Incluir en las páginas HTML
en las cuales tú quieres que se ejecute tu Script CGI, las etiquetas
de llamada correspondientes.
CGI es la
interfaz "genérica " entre el servidor y los programas
residentes en el servidor. CGI especifica como la
data es enviada al programa
y como la data puede ser regresada por el programa a través del
servidor y de regreso al
navegador que originalmente envió
la data. El mecanismo básico para hacer esto es el siguiente:
a) Enviando data al Programa
CGI especifica
COMO la data es enviada al programa ó Script CGI (ya sea a través
de las variables de ambientes ó
como data leída por el programa como
entrada estándar) y que data es enviada (en general , se envía
toda la data enviada por
el cliente al servidor, más
variables de ambientes que describen el status del servidor).
b) Regresando Data al Cliente
Para regresar
data al cliente (a través de su navegador) , el programa ó
Script CGI sólo escribe la data en la salida
estándar. Esta data es enviada al
cliente después de algún procesamiento del servidor
para asegurar que se tiene el correcto
mensaje de encabezado que describa la data
y el estado de la transacción. Un punto de atención importante
es que el Script
CGI debe escribir a su salida estándar
, antes que cualquier información, los mensajes de encabezado que
definan el tipo de
data que se está enviando (esta es
la única manera a través de la cual el servidor puede saber
el tipode data que se está
regresando) y una línea en blanco
que separa los mensajes de encabezado con a data enviada.
Cada vez que un
cliente ejecuta un script CGI a través de una línea de Comando
URL, el servidor ejecuta el script en tiempo
real. La salida del programa irá
directamente al cliente, pero es imposible enviar opciones y/o argumentos
a través de la línea de comando al Script CGI. Para poder
establecer este tipo de comunicación el programa CGI usa lo siguiente:
Variables de Ambiente: La mayor parte
de la información que necesita un Script CGI está disponible
a través de las variables
de ambientes. Los servidores ocasionalmente
pueden variar en la lista de los nombres de variables de ambientes que
ellos asignan,
por lo que debemos chequear la documentación
del servidor para conocer los nombres de las variables de ambiente disponibles.
Entre la lista de las más comunes
tenemos:
| AUTH_TYPE | El método de autenticación usado para validar un usuario |
| CONTENT_LENGTH | La longitud de la data de consulta pasada al CGI a través del estándar input |
| CONTENT_TYPE | El tipo de data enviado a través de la consulta i.e text/html |
| DOCUMENT_ROOT | El directorio desde el cual los documentos web son tomados |
| HTTP_ACCEPT | Una lista de los tipo de data que el cliente puede aceptar |
| HTTP_FROM | La dirección de correo del usuario que está haciendo la consulta |
| HTTP_REFERRER | EL URL del documento que el cliente acesó antes de acezar el Script CGI |
| HTTP_USER_AGENT | El navegador que el cliente está usando para hacer la petición |
| PATH_INFO | Información de caminos adicionales pasados al Script CGI |
| QUERY_STRING | La información de consulta que se le pasa al programa. Se le añade al URL después del signo de interrogación (?). |
| REMOTE_ADDRESS | La dirección IP remota desde la cual el usuario está haciendo el requerimiento |
| REMOTE_HOST | El nombre remoto del servidor desde el cual el usuario está haciendo el requerimiento |
| REMOTE_IDENT | El usuario que está haciendo el requerimiento |
| REMOTE_USER | El nombre autentificado del usuario haciendo el requerimiento |
| REQUEST_METHOD | El método mediante el cual la información requerida es solicitada ( i.e GET, POST,HEAD) |
| SCRIPT_NAME | El camino virtual del Script que se está ejecutando |
| SERVER_NAME | El nombre ó dirección IP del Servidor |
| SERVER_SOFTWARE | El nombre y la versión del software que está respondiendo los requerimientos del cliente |
Como el Script
CGI es un programa, entonces básicamente Ud. Está dejando
al mundo correr un programa en su sistema,
lo cual no es lo mas seguro de hacer. Los
Scripts de CGI pueden presentar brechas de inseguridad en dos sentidos:
1. Ellos pueden intencionalmente ó
no dejar escapar información sobre tu servidor que pueda
ayudar a los hackers a atacar
el mismo
2. Los Scripts CGI que procesan entrada
de usuarios remoto, tales como el contenido de una forma ó
un comando de busqueda indexada, puden ser vulnerables a ataques
en los cuales el usuario enfaña estas entradas para lograr
que ejecute comandos.
Por estas
dos importantes razones, es necesario tomar algunas precauciones
de seguridad que necesitan ser implementadas
cuando se usan Script CGI. Entre ellas están:
a) Es mejor guardar los scripts CGI en el
directorio cgi-bin para poder tener un mejor conocimiento de cuales Scripts
CGI
son mantenidos en cada
servidor en lugar de tenerlos diseminados por varios directorios del mismo.
Adicionalmente , el
directorio cgi-bin usualmente
tienen controles de seguridad muy cerrados lo cual evita la posibilidad
de que algun hacker
pueda colocar un archivo
*.cgi en tu servidor y después ejecutarlo a través de un
URL
b) Los códigos compilados son más
seguros que los Scripts interpretados ya que no se tiene acceso tan rápido
a la lógica del
programa y es menos vulnerable
a ser atacado.
c) Antes de instalar un Script CGI que encontrastes
en la WEB , examinalo muy bien primero para evitar daños no deseados
a tu sistema.
d) Evita en tus scripts CGI dar mucha información acerca de tu sitio y to servidor.
e) Si estás usando lenguage compilado como C, evita asumir el tamaño de la entrada estándar del usuario.
f) Nunca pases entradas remotas de los usuarios que no han sido chequedas hacia una linea de comando.
g) Invoca tus programas usando su camino completo y evita usar la variable de ambiente PATH para poder acceder a ellos.
h) Siempre, cuando te sea posible, usa los
CGI WRAPPERS. Estos scripts encapsuladores pueden proporcionar
ciertos
chequeos de seguridad
en el Script CGI, tales como cambiar el dueño del proceso
que ejecuta el Script CGI ó usar algún
mecanismo de unix para
colocar el Scrpt CGI en un área restringida del sistema de
archivos del servidor.
CGI y SSI (Server-Sides Includes) son generalmente
intercambiables y por lo general es más un asunto de preferencia
personal el usar uno en lugar del otro.
Sin embargo, existen algunas diferencias y guías que siempre es
bueno acotar y que
pueden servir para ayudar en la selección
de uno sobre el otro:
a) CGI es un estándar común
que ha sido aceptado y está soportado por la gran mayoría
de HTTPDs. SSI no es un estándar
común, pero una innovación
de NCSA's HTTPD, la cual ha sido adoptada en servidores posteriores. CGI
tiene altamente
portableis entre plataformas,,,,
en caso de que este sea un punto a considerar..
b) Si su requerimeinto es suficientemente
simple que puede ser elaborado usando SSI sin necesidad de invocar un comando
exec desde la página
HTML, entonces es muy probable que SSI sea más eficiente.
c) Para aplicaciones más complejas
donde necesitas ejecutar un programa en cualquiera de los casos, CGI es
generalmente la
mejor selección.
d) Si tu transacción retorna una respuesta que no es una página de HTML, entonces SSI no es una opción viable en absoluto.
Actualmente existen muchas variantes de SSI
disponibles, probablemente la mejor conocida sea PHP, la cual te permite
encapsular script del servidor en una página
previa de HTML, y por supuesto ASP que es la versión de Microsoft
para una
interfaz similar...