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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Envió de archivo binario por HTTP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Envió de archivo binario por HTTP  (Leído 4,098 veces)
yeikos


Desconectado Desconectado

Mensajes: 1.424



Ver Perfil
[C] Envió de archivo binario por HTTP
« en: 4 Mayo 2010, 20:09 pm »

Buenas, llevo ya un par de años sin programar en c y ahora resulta que necesito realizar un trabajo y estoy desde ayer con el mismo problema :(

La funcion que estoy desarrollando es sencilla en si, su misión es enviar un archivo cualquiera en forma de peticion, así un script en PHP alojado en el servidor, podrá coger el archivo.


El problema lo tengo con los null bytes, al tratarse de archivos binarios (imagenes, ejecutables, etc) estos contienen nullbytes y me cortan la cadena, como primera solución opte por leer el archivo binario poco a poco e id enviandolo por partes, pero el problema, es que send, por lo que estoy observando, realiza tantas peticiones como envios se hagan, entonces, si corto el header para enviar luego el archivo, el servidor no entendera ninguna peticion, ya que estaran todas incompletas.


¿Alguna solucion/alternativa?


Código
  1. "POST %s HTTP/1.1\r\n"
  2. "Host: %s\r\n"
  3. "Content-Type: multipart/form-data; boundary=---------------------------%s\r\n"
  4. "Content-Length: %i\r\n\r\n"
  5. "-----------------------------%s\r\n"
  6. "Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n"
  7. "Content-Type: %s\r\n\r\n"
  8. "%s"
  9. "\r\n-----------------------------%s\r\n"


Gracias y saludos!
 


En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: [C] Envió de archivo binario por HTTP
« Respuesta #1 en: 4 Mayo 2010, 20:33 pm »

Para esto está la codificación Base64, te deja todo el rango de bytes en un rango de carácteres ASCII, y lo mandas de una petición. Y sino mira como lo hace(con un sniffer por ejemplo) cualquier web de internet, debe de ser parecido


En línea

yeikos


Desconectado Desconectado

Mensajes: 1.424



Ver Perfil
Re: [C] Envió de archivo binario por HTTP
« Respuesta #2 en: 4 Mayo 2010, 20:53 pm »

jaja, resulta que hará cosa de 1 año hice una funcion para codificar en base64, y adivinas que problema tuve? los null byte me cortaban la cadena -_- aunque solucionar eso es tan facil como buscar una libreria o funcion ya depurada. Pero se que esa no es la solucion correcta, ya que enviarlo en base64 es opcional, no obligatorio. De todas maneras gracias por la idea =)

a ver si se encuentra otra solucion :s
En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: [C] Envió de archivo binario por HTTP
« Respuesta #3 en: 4 Mayo 2010, 20:59 pm »

De todas formas send y fread no cortan las cadenas, porque les tienes que indicar el tamaño. No sé cual es tu problema, no usarás alguna función de string.h? (strXXX)
En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: [C] Envió de archivo binario por HTTP
« Respuesta #4 en: 4 Mayo 2010, 21:01 pm »

http://www.faqs.org/rfcs/rfc1867.html
No olvides comentar tu solución
En línea

yeikos


Desconectado Desconectado

Mensajes: 1.424



Ver Perfil
Re: [C] Envió de archivo binario por HTTP
« Respuesta #5 en: 4 Mayo 2010, 23:16 pm »

 Es sprintf quien me corta la cadena, ahora solo he utilizado sprintf hasta antes de concatenar el archivo binario, ahora jugare con los punteros y cuento mis resultados.
En línea

yeikos


Desconectado Desconectado

Mensajes: 1.424



Ver Perfil
Re: [C] Envió de archivo binario por HTTP
« Respuesta #6 en: 4 Mayo 2010, 23:45 pm »

He aqui la solución, gracias biribau por ayudarme :D


Código
  1. // create header var
  2. char *header = (char *)malloc(header_size+1);
  3. memset(header, 0x00, header_size+1);
  4. sprintf(header,
  5.  "POST %s HTTP/1.1\r\n"
  6. "Host: %s\r\n"
  7. "Content-Type: multipart/form-data; boundary=---------------------------%s\r\n"
  8. "Content-Length: %i\r\n\r\n"
  9. "-----------------------------%s\r\n"
  10. "Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n"
  11. "Content-Type: %s\r\n\r\n",
  12. path, host, boundary, content_size, boundary, varname, filename, type
  13. );
  14.  
  15.  
  16. // concat file content and rest
  17. x = strlen(header);
  18. memcpy (header+x, file,filesize);
  19. sprintf(header+x+filesize, "\r\n-----------------------------%s\r\n", boundary);
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con archivo binario, por favor. « 1 2 »
Programación C/C++
carlosguay 12 7,349 Último mensaje 25 Abril 2011, 13:53 pm
por Arkangel_0x7C5
Insertar datos en Archivo Binario
Programación C/C++
willy1855 7 4,929 Último mensaje 16 Abril 2012, 05:27 am
por durasno
recorrer archivo binario
Programación C/C++
m@o_614 3 2,850 Último mensaje 25 Octubre 2013, 17:59 pm
por rir3760
Ayuda envío archivo a web con C vía http « 1 2 ... 7 8 »
Programación C/C++
Kaxperday 78 23,581 Último mensaje 29 Agosto 2017, 21:09 pm
por ivancea96
Desensamblado de un archivo binario
Ingeniería Inversa
Omar_2013 3 2,683 Último mensaje 26 Noviembre 2014, 19:43 pm
por Omar_2013
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines