Autor
|
Tema: Validando peticion GET manualmente (Leído 3,000 veces)
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Buen dia estoy desarrollando un pequeño servidor en C para un proyecto que tengo. Ya tengo buena parte trabajado, pero me gustaria consultarles si existen mas cosas que deba de validar en una peticion GET el ejemplo que mas o menos tengo del codigo es el siguiente: #include<stdio.h> #include<stdlib.h> #include<string.h> #define KB 1024 int main() { char *type,*resource,*protocol,*extra,*hasQuery,**values = NULL,*key,*value,*aux; int values_count= 0,i; strcpy(temp ,"GET /LALALA/xD.txt?q=xD&XD HTTP/1.1"); printf("type = %p: %s\n",type ,type ); printf("resource = %p: %s\n",resource ,resource ); printf("protocol = %p: %s\n",protocol ,protocol ); hasQuery = strstr(resource ,"?"); if(hasQuery) { printf("query = %p: %s\n",hasQuery ,hasQuery ); do { if(aux) { values = realloc(values ,sizeof(char*)*(values_count +1)); values[values_count] = aux; printf("values: %s\n",values [values_count ]); values_count++; } }while(aux); i = 0; while(i < values_count) { //Aqui salvo los valores key y value para su posterior uso printf("Key: %s\nValue: %s\n",key ,value ); i++; } } else printf("query = %p\n",hasQuery ); if(values) if(temp) { } }
Estoy releyendo el protocolo del HTTP y estoy validando de momento solo la primera LINEA de la peticion. Saludos!
|
|
« Última modificación: 14 Septiembre 2016, 00:06 am por AlbertoBSD »
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Buenas,
Según veo quieres validar solo la request line y solo para el caso de GET, entonces me parece que la validación puede considerarse correcta, aquí los límites los pones tu si quieres un server de calidad asegurate de hacer un buen control de errores, sino me equivoco todos los HTTP request (incluido el GET por supuesto) tienen en su request line 3 partes: el método, la uri, y la versión de protocolo HTTP empleado, si tienen más o menos de 3 deberías considerar la request como errónea.
Para un GET no veo necesario validar más, ahora deberías de pensar en validar los headers también, e implementar los métodos que deeses y que debes de mostrar cuando te envíen un HTTP OPTIONS.
También cuidado al programar el GET pues por lo general sirve archivos, y pueden hacer algo como "GET ../../passwords.txt HTTP 1.1" y puedan acceder a directorios anteriores que el de la carpeta root del servidor, para ello debes controlar que la uri no empiece con "..", pero eso ya sería más adelante cuando vayas a servir el archivo.
Ánimo con el proyecto, me parece interesante.
Un saludo.
|
|
« Última modificación: 13 Septiembre 2016, 21:12 pm por Kaxperday »
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
kub0x
Enlightenment Seeker
Colaborador
Desconectado
Mensajes: 1.486
S3C M4NI4C
|
Como ejemplo está bien, pero ten cuidado con el parseo/análisis de datos arbitrarios y su consecutivo almacenamiento, pues un buffer overrun podría terminar en consecuencias serias. Por ejemplo podría mandar un paquete que no siguiera el esquema de request de HTTP, sin GET ni POST ni otros.
Lo mejor es seguir el RFC, también te ahorraras cuelgues estilo DOS/DDoS manteniendo la tabla de sesión (socks) en buen estado (apache slowloris que recuerdos).
Saludos!
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Muchas gracias por contestar, sabia que te interesaria el topic. También cuidado al programar el GET pues por lo general sirve archivos, y pueden hacer algo como "GET ../../passwords.txt HTTP 1.1" Claro que habia considerado los dotdotpwn... de hecho el recurso siempre lo valido, contra una tabla de recursos validos, si existe lo carga pero con el segundo campo de mi tabla (Un archivo previamente validado con su path valido). Ya he validado tambien los headers y solo estoy trabajando para leer los datos cuando se trata de un POST, estoy haciendo una pequeña tabla de estados para saber que es lo que sigue y en caso de no coindidir el numero de tokens o alguna otra variable marque error. Saludos!
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
strcpy(temp ,"GET /LALALA/xD.txt?q=xD&XD HTTP/1.1");
Como detalle, yo comprobaría que las 3 partes son correctas. Que no tengan caracteres inválidos (como saltos de línea o retornos de carro), y que tanto el "type" como el "protocol" sean válidos; aunque supongo que eso ya lo tendrás en cuenta en el futuro xD Oh, y yo dejaría de usar ese strtok cuanto antes. Si es un servidor, es probable que pretendas hacerlo multi-thread.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Oh, y yo dejaría de usar ese strtok cuanto antes. Si es un servidor, es probable que pretendas hacerlo multi-thread. Muy bien acabo de ver los problemas que implica y al parecer no debo de usarlo xD usare strtok_r en su lugar con un 3 parametro para salvar el estado de la funcion. Saludos
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
hacer manualmente dvd
Multimedia
|
mercuri
|
1
|
2,077
|
25 Enero 2005, 03:24 am
por Songoku
|
|
|
Centrar texto manualmente
Programación Visual Basic
|
erick185
|
1
|
1,927
|
11 Marzo 2006, 06:36 am
por .Slasher-K.
|
|
|
Desempaquetando UPX manualmente.
Ingeniería Inversa
|
Nanocity
|
3
|
4,533
|
4 Junio 2010, 01:15 am
por Nanocity
|
|
|
Android - Problema validando el contenido de un EditText (Solucionado + o - )
Java
|
Aberroncho
|
1
|
5,810
|
14 Abril 2014, 23:54 pm
por Aberroncho
|
|
|
Validando la edad de un usuario con Condiciones en javascript
Desarrollo Web
|
Ali Baba
|
0
|
1,570
|
19 Febrero 2017, 01:37 am
por Ali Baba
|
|