Después de preparar la presentación de Una introdución a Perl 6 me llamó mucho la atención las funcionalidades que ofrece Perl6 sobre programación reactiva y gestión de eventos, así que después de mostrar cómo funciona un servidor HTTP con Perl5 me propuse hacerlo también con Perl6.
Con Perl6 es un poco distinto en cuanto a sintaxis y soporte multihilo pero la forma de gestionar HTTP es la misma. En cuanto al soporte multihilo existe la clase IO::Socket::Async.listen que proporciona la creación y puesta a la escucha de sockets asíncronos con soporte multihilo, de forma que por cada conexión crea un hilo alojado en un pool que Perl6 gestiona internamente.
La prueba de concepto la puedes encontrar aquí.
Este mini servidor web funciona en Windows y GNU/Linux con Rakudo Perl6 instalado y un par de módulos de Perl6 (URI y URI::Escape) que interpretan de forma adecuada las URIs que llegan al servidor.
La parte CGI se realiza mediante módulos de Perl6 y con el resto tenemos un servidor web funcional pero muy básico (solo contempla los códigos HTTP 200 y 404).
El frontal se compone de HTML, CSS y Javascript con JQuery para gestionar la conexión asíncrona con el script CGI de Perl6 que hace de servicio web.
Mostrando entradas con la etiqueta html. Mostrar todas las entradas
Mostrando entradas con la etiqueta html. Mostrar todas las entradas
jueves, 28 de julio de 2016
Mini servidor HTTP & CGI con Perl6
Etiquetas:
html,
http,
javascript,
linux,
perl6,
servidores web,
web
sábado, 1 de marzo de 2014
miniServidor Web en Windows
Mirando un poco cómo hacer una pequeña aplicación en lenguaje C para probar Sockets y comunicar programas a través de TCP/IP, encontré que el compilador LCC-Win trae una biblioteca llamada netutils.h dejando el asunto fácil y muy interesante.
Adaptando un poco el ejemplo de la aplicación servidor que trae la documentación, decidí dar un repaso al protocolo HTTP y crear un pequeño servidor Web.
El funcionamiento de este miniServidor Web sería muy sencillo y no cumpliría mucho con el estándar, pero para ver cómo funciona por dentro está bien. Lo que hace es lo siguiente:
El código fuente sería el siguiente (servidor.c):
Una vez creado servidor.c, en la misma carpeta creamos el archivo HTML que queremos publicar en nuestro miniServidorWeb (holamundo.html), cuyo código sería el siguiente:
Asumiendo que LCC-Win está instalado en c:\lcc y que tenemos la ruta de los binarios del compilador (c:\lcc\bin) incluida en la variable PATH del sistema, ya podemos compilar y enlazar:
lcc servidor.c
lcclnk servidor.obj c:\lcc\lib\netutils.lib
Con esto tendremos el ejecutable servidor.exe creado, que es nuestro miniServidor Web. Lo ejecutamos dándole como parámetro el nombre del archivo HTML a publicar:
servidor.exe holamundo.html
Y el miniServidor Web quedará a la escucha en el puerto 10000 de la IP 127.0.0.1, datos proporcionados en el código fuente. Ahora le toca al cliente, vamos al navegador Web y tecleamos la URL:
http://127.0.0.1:10000
Con esto el navegador Web conecta con la IP indicada en el puerto 10000 y recupera nuestro HTML.
Mientras, en la ventana donde ejecutamos el miniServidor Web aparecerán los datos recibidos y los enviados en cada sesión HTTP.
Y ahí lo tienes, el servidor Web más pequeño del mundo.
Adaptando un poco el ejemplo de la aplicación servidor que trae la documentación, decidí dar un repaso al protocolo HTTP y crear un pequeño servidor Web.
El funcionamiento de este miniServidor Web sería muy sencillo y no cumpliría mucho con el estándar, pero para ver cómo funciona por dentro está bien. Lo que hace es lo siguiente:
- Leer un archivo HTML dado como parámetro.
- Iniciar una sesión de conexión a un Socket en la IP 127.0.01 en el puerto 10000.
- Esperar una conexión de un navegador web.
- Cuando reciba una conexión, visualiza la información recibida (las cabeceras HTTP del navegador).
- Preparar las cabeceras HTTP de respuesta.
- Leer el archivo HTML dado y agregarlo a las cabeceras anteriores.
- Enviar la respuesta al navegador (cabeceras HTTP y el HTML).
- Visualizar los datos enviados.
El código fuente sería el siguiente (servidor.c):
#include <stdio .h>
#include "netutils.h"
int main(int argc,char *argv[])
{
while (1)
{
FILE* pf;
if ((pf = fopen(argv[1],"rt")) == NULL)
{
puts("Error abriendo html.");
return 1;
}
Session session;
char buf[8192];
memset (&session,0,sizeof(session));
session.port = 10000;
session.Host = "127.0.0.1";
if (ServerConnect(&session)){ return 0; }
printf("Conectado...\n");
memset(buf,0,sizeof(buf));
if (Receive(&session,sizeof(buf)-1,buf)) { return 0; }
printf("Datos recibidos:\n\n %s\n",buf);
char texto[1000000] = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n";
int c, i = strlen(texto);
while ( (c=getc(pf) ) != EOF){ texto[i] = c; i++; }
texto[i] = '\0';
fclose(pf);
if (Send(&session,strlen(texto),texto)){ return 0; }
printf("Datos enviados:\n\n %s\n", texto);
CloseSession(&session);
printf("\nConexion cerrada.\n");
}
}
printf("Datos recibidos:\n\n %s\n",buf);
char texto[1000000] = "HTTP/1.1 200 OK\nContent-Type: text/html\n\n";
int c, i = strlen(texto);
while ( (c=getc(pf) ) != EOF){ texto[i] = c; i++; }
texto[i] = '\0';
fclose(pf);
if (Send(&session,strlen(texto),texto)){ return 0; }
printf("Datos enviados:\n\n %s\n", texto);
CloseSession(&session);
printf("\nConexion cerrada.\n");
}
}
Una vez creado servidor.c, en la misma carpeta creamos el archivo HTML que queremos publicar en nuestro miniServidorWeb (holamundo.html), cuyo código sería el siguiente:
<html>
<head>
<title>Titulo>/title>
</head>
<body>
<p><h1>Hola Mundo</h1></p>
</body>
</html>
<head>
<title>Titulo>/title>
</head>
<body>
<p><h1>Hola Mundo</h1></p>
</body>
</html>
Asumiendo que LCC-Win está instalado en c:\lcc y que tenemos la ruta de los binarios del compilador (c:\lcc\bin) incluida en la variable PATH del sistema, ya podemos compilar y enlazar:
lcc servidor.c
lcclnk servidor.obj c:\lcc\lib\netutils.lib
Con esto tendremos el ejecutable servidor.exe creado, que es nuestro miniServidor Web. Lo ejecutamos dándole como parámetro el nombre del archivo HTML a publicar:
servidor.exe holamundo.html
Y el miniServidor Web quedará a la escucha en el puerto 10000 de la IP 127.0.0.1, datos proporcionados en el código fuente. Ahora le toca al cliente, vamos al navegador Web y tecleamos la URL:
http://127.0.0.1:10000
Con esto el navegador Web conecta con la IP indicada en el puerto 10000 y recupera nuestro HTML.
Mientras, en la ventana donde ejecutamos el miniServidor Web aparecerán los datos recibidos y los enviados en cada sesión HTTP.
Y ahí lo tienes, el servidor Web más pequeño del mundo.
domingo, 6 de septiembre de 2009
Conoce la web y defiéndete con ella
Para navegar por la web de forma segura hay, entre otros, conceptos básicos como:
- Saber en qué URL estamos y como se construyen
- Diferenciar webs falsas de las verdaderas
- Diferenciar un enlace javascript de otro convencional
- Rellenar formularios de forma segura
- Identificar y gestionar los complementos web del navegador
miércoles, 20 de agosto de 2008
El caso L-A-C (1/3)
El caso L-A-C (1/3)
El caso L-A-C (2/3)
El caso L-A-C (3/3)
Analizando el origen del código de un website, al final y después de la etiqueta del fin del código HTML, aparecía un trozo de javascript bastante sospechoso:

Lo que más llama la atención aquí es el contenido de la cadena str, que es una serie de números decimales separados por el símbolo de admiración. Estos números decimales deben tener una correspondencia, y lo más seguro es que sea en ASCII.
Para comprobar rápidamente esta correspondencia, utilicé la utilidad on-line JavaScript ASCII Converter de los chicos de HolyCarrot. Introduje la cadena en el campo "Enter decimal ASCII here.", le dí a "Calculate" y en el campo de arriba apareció la equivalencia en ASCII...

toda una revelación.
Como sabemos, iframe incrusta un HTML en el HTML actual.
Con la herramienta Paros Proxy intenté analizar la respuesta de "http://b.l-a-c.cn/" pero no hubo respuesta. Entonces intenté analizar la respuesta del dominio principal "http://l-a-c.cn/" y el resultado fué escalofriante:

Una obra de arte en javascript que, cargada en Internet Explorer provoca un desbordamiento de memoria: KERNEL32.LoadLibraryA. Tiene toda la pinta de un rootkit.
Veamos más información acerca de "http://l-a-c.cn/":
Domain Name: l-a-c.cn
ROID: 20080726s10001s95148405-cn
Domain Status: clientTransferProhibited
Registrant Organization: l-a-c.cn
Registrant Name: Alison Fineman
Administrative Email: ****@CHINOPOSTALPLACE.COM
Sponsoring Registrar: 厦门三五互联科技股份有限公司
Name Server:ns1.mynsnet.biz
Name Server:ns2.mynsnet.biz
Registration Date: 2008-07-26 21:50
Expiration Date: 2009-07-26 21:50
IP Address: 202.151.177.35
IP Location: Thailand
Website Status: active
Server Type: Apache/2
Cache Date: 2008-08-19 12:36:49 MST
Estos datos dicen que el host tiene la versión 2 de Apache, está en Thailandia a nombre de Alison Fineman (a saber de donde han sacado ese nombre) y lo de ****@CHINOPOSTALPLACE.COM es muy gracioso.
El registro del nombre de dominio es bastante reciente: el 26 de julio de este año.
Veamos los puertos abiertos de nuestro amigo el chino:
C:\nmap>nmap -sS 202.151.177.35
Starting Nmap 4.60 ( http://insecure.org ) at 2008-08-20 16:00 Hora estandar romance
Interesting ports on ppp-202.151.177.35.revip.proen.co.th (202.151.177.35):
Not shown: 1703 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
53/tcp open domain
80/tcp open http
110/tcp open pop3
143/tcp open imap
443/tcp open https
587/tcp open submission
993/tcp open imaps
995/tcp open pop3s
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 65.218 seconds
C:\nmap>
Vamos, que tiene casi todas las ventanas bien abiertas, para dar servicio.
Viendo todo esto, sólo queda la moraleja:
Firefox y Noscript
siempre antes de salir.
Que la calle está más mala que en los 80's
Salu2.
rAmIx
El caso L-A-C (1/3)
El caso L-A-C (2/3)
El caso L-A-C (3/3)
El caso L-A-C (2/3)
El caso L-A-C (3/3)
Analizando el origen del código de un website, al final y después de la etiqueta del fin del código HTML, aparecía un trozo de javascript bastante sospechoso:
Lo que más llama la atención aquí es el contenido de la cadena str, que es una serie de números decimales separados por el símbolo de admiración. Estos números decimales deben tener una correspondencia, y lo más seguro es que sea en ASCII.
Para comprobar rápidamente esta correspondencia, utilicé la utilidad on-line JavaScript ASCII Converter de los chicos de HolyCarrot. Introduje la cadena en el campo "Enter decimal ASCII here.", le dí a "Calculate" y en el campo de arriba apareció la equivalencia en ASCII...
toda una revelación.
Como sabemos, iframe incrusta un HTML en el HTML actual.
Con la herramienta Paros Proxy intenté analizar la respuesta de "http://b.l-a-c.cn/" pero no hubo respuesta. Entonces intenté analizar la respuesta del dominio principal "http://l-a-c.cn/" y el resultado fué escalofriante:
Una obra de arte en javascript que, cargada en Internet Explorer provoca un desbordamiento de memoria: KERNEL32.LoadLibraryA. Tiene toda la pinta de un rootkit.
Veamos más información acerca de "http://l-a-c.cn/":
Domain Name: l-a-c.cn
ROID: 20080726s10001s95148405-cn
Domain Status: clientTransferProhibited
Registrant Organization: l-a-c.cn
Registrant Name: Alison Fineman
Administrative Email: ****@CHINOPOSTALPLACE.COM
Sponsoring Registrar: 厦门三五互联科技股份有限公司
Name Server:ns1.mynsnet.biz
Name Server:ns2.mynsnet.biz
Registration Date: 2008-07-26 21:50
Expiration Date: 2009-07-26 21:50
IP Address: 202.151.177.35
IP Location: Thailand
Website Status: active
Server Type: Apache/2
Cache Date: 2008-08-19 12:36:49 MST
Estos datos dicen que el host tiene la versión 2 de Apache, está en Thailandia a nombre de Alison Fineman (a saber de donde han sacado ese nombre) y lo de ****@CHINOPOSTALPLACE.COM es muy gracioso.
El registro del nombre de dominio es bastante reciente: el 26 de julio de este año.
Veamos los puertos abiertos de nuestro amigo el chino:
C:\nmap>nmap -sS 202.151.177.35
Starting Nmap 4.60 ( http://insecure.org ) at 2008-08-20 16:00 Hora estandar romance
Interesting ports on ppp-202.151.177.35.revip.proen.co.th (202.151.177.35):
Not shown: 1703 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
53/tcp open domain
80/tcp open http
110/tcp open pop3
143/tcp open imap
443/tcp open https
587/tcp open submission
993/tcp open imaps
995/tcp open pop3s
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 65.218 seconds
C:\nmap>
Vamos, que tiene casi todas las ventanas bien abiertas, para dar servicio.
Viendo todo esto, sólo queda la moraleja:
Firefox y Noscript
siempre antes de salir.
Que la calle está más mala que en los 80's
Salu2.
rAmIx
El caso L-A-C (1/3)
El caso L-A-C (2/3)
El caso L-A-C (3/3)
Suscribirse a:
Comentarios (Atom)