elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Validando peticion GET manualmente
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Validando peticion GET manualmente  (Leído 3,000 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Validando peticion GET manualmente
« en: 13 Septiembre 2016, 20:36 pm »

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:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define KB 1024
  6.  
  7. int main() {
  8. char *type,*resource,*protocol,*extra,*hasQuery,**values = NULL,*key,*value,*aux;
  9. int values_count= 0,i;
  10. char *temp = malloc(KB);
  11. strcpy(temp,"GET /LALALA/xD.txt?q=xD&XD HTTP/1.1");
  12. type = strtok(temp," ");
  13. resource = strtok(NULL," ");
  14. protocol = strtok(NULL," ");
  15. extra = strtok(NULL," ");
  16. printf("type = %p: %s\n",type,type);
  17. printf("resource = %p: %s\n",resource,resource);
  18. printf("protocol = %p: %s\n",protocol,protocol);
  19. printf("extra = %p\n",extra);
  20. hasQuery = strstr(resource,"?");
  21. if(hasQuery) {
  22. printf("query = %p: %s\n",hasQuery,hasQuery);
  23. aux =  strtok(hasQuery+1,"&");
  24. do {
  25. if(aux) {
  26. values = realloc(values,sizeof(char*)*(values_count+1));
  27. values[values_count] = aux;
  28. printf("values: %s\n",values[values_count]);
  29. values_count++;
  30. }
  31. aux =  strtok(NULL,"&");
  32. }while(aux);
  33. i = 0;
  34. while(i < values_count) {
  35. key = strtok(values[i],"=");
  36. value = strtok(NULL,"");
  37. //Aqui salvo los valores key y value para su posterior uso
  38. printf("Key: %s\nValue: %s\n",key,value);
  39. i++;
  40. }
  41. }
  42. else
  43. printf("query = %p\n",hasQuery);
  44. if(values)
  45. free(values);
  46. if(temp) {
  47. free(temp);
  48. }
  49. }
  50.  
  51.  

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 Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Validando peticion GET manualemente
« Respuesta #1 en: 13 Septiembre 2016, 21:10 pm »

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 Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: Validando peticion GET manualemente
« Respuesta #2 en: 13 Septiembre 2016, 23:17 pm »

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

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Validando peticion GET manualemente
« Respuesta #3 en: 13 Septiembre 2016, 23:27 pm »

Muchas gracias por contestar, sabia que te interesaria el topic.

Citar
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 Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Validando peticion GET manualemente
« Respuesta #4 en: 13 Septiembre 2016, 23:34 pm »

Código
  1. strcpy(temp,"GET /LALALA/xD.txt?q=xD&XD HTTP/1.1");
  2. type = strtok(temp," ");
  3. resource = strtok(NULL," ");
  4. protocol = strtok(NULL," ");
  5. extra = strtok(NULL," ");
  6.  

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 Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Validando peticion GET manualmente
« Respuesta #5 en: 14 Septiembre 2016, 00:08 am »

Citar
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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
hacer manualmente dvd
Multimedia
mercuri 1 2,077 Último mensaje 25 Enero 2005, 03:24 am
por Songoku
Centrar texto manualmente
Programación Visual Basic
erick185 1 1,927 Último mensaje 11 Marzo 2006, 06:36 am
por .Slasher-K.
Desempaquetando UPX manualmente.
Ingeniería Inversa
Nanocity 3 4,533 Último mensaje 4 Junio 2010, 01:15 am
por Nanocity
Android - Problema validando el contenido de un EditText (Solucionado + o - )
Java
Aberroncho 1 5,810 Último mensaje 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 Último mensaje 19 Febrero 2017, 01:37 am
por Ali Baba
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines