Le http post OK. Mais pour un UPLOAD de fichier ?

pdessoulles Messages postés 2 Date d'inscription dimanche 21 septembre 2003 Statut Membre Dernière intervention 28 octobre 2004 - 22 sept. 2003 à 03:10
nomodie Messages postés 6 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 8 juin 2004 - 27 mars 2004 à 11:26
Salut à tous,

Le problème suivant me pourrit la vie depuis quelques jours :

J'arrive bien à envoyer des données sur une socket ouverte sur un serveur http avec les méthodes post ou get, mais pour la "post", je sèche sur l'upload de fichier.

Un formulaire html en "post" simple est :

<form action="toto.php" method="post" name="form1" onSubmit="return true;">


</form>

ce qui donne, lorsqu'on a saisi "canari", pour la chaîne de caractère à envoyer sur la socket:

"POST toto.php HTTP/1.1\r\n"
"Host: www.site_web.com\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Content-Length: 11\r\n" // taille des données qui suivent
"\r\n"
"titi=canari\r\n"
"\r\n"

Et dans le script php qui récupère les données, "toto.php", on a bien :
$_POST['titi'] qui renvoie la valeur "canari"

Tout ça, c'est très bien et ça marche, mais ce que j'aimerais, c'est savoir quoi envoyer à la socket avec le formulaire d'upload de fichier :

<form enctype="multipart/form-data" action="send.php" method="post">

Send this file:


</form>

qui a pour conséquence, dans le script php "send.php" de remplir le tableau superglobal $_FILES[] et non pas $_POST[] (tout en uploadant, bien entendu, le fichier en question dans le répertoire temporaire du site web)

A celui ou ceux qui pourront m'aider.. et me rendre le sommeil, un grand merci.

Philippe

7 réponses

amodels Messages postés 17 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 17 juillet 2006
29 nov. 2003 à 01:15
Bonjour.
Comme vous avez noté pouvoir lancer un fichier PHP distant, je me demandais si vous pourriez m'envoyer le source C de cet exploit ;) En effet, je suis dessus depuis plusieurs mois ;(
Je bloque sur les fonctions du C 'recv()' et 'sendto()'.
J'espère pouvoir ensuite vous aider ...
Merci d'avance
Zian (dune2@free.fr)
0
amodels Messages postés 17 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 17 juillet 2006
29 nov. 2003 à 13:25
Rebonjour, voici le code que j'expérimente :

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;

sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sock = socket(AF_INET,SOCK_STREAM,0);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
printf("\n\n -> CONNEXION OK");

send(sock,"POST toto.php HTTP/1.1\r\n",24,0);
send(sock,"Host: 127.0.0.1\r\n",23,0);
send(sock,"Content-Type: application/x-www-form-urlencoded\r\n",49,0);
send(sock,"Content-Length: 11\r\n",20,0); // le 11 est la taille de 'titi=canari'
send(sock,"\r\n",2,0);
send(sock,"titi=canari\r\n",13,0);
send(sock,"\r\n",2,0);

printf("\n\n -> TRANSFERT OK");
closesocket(sock);
WSACleanup();
}

Ca ne fonctionne malheureusement pas.
Please help :)
0
nomodie Messages postés 6 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 8 juin 2004
1 mars 2004 à 15:39
bon, pour mon premier post, j'espere ne pas ecrire trop de conneries......
J'ai testé ton prog, amodels, pour acceder a un serveur apache en local(EasyPHP), effectivement, il me ressort une erreur 10048, socket deja utilisée. En matant l'aide en ligne, ils indiquent qu'un client (ce qui a l'ai d'etre le cas ici) n'a pas forcement besoin d'appeleer la fonction bind() (ma theorie perso: bind doit rendre l'usage d'une socket exclusive, et vu qu'apache doit en creer une pour ecouter sur le port 80,ca bug....).
Une fois fait, je me connecte bien (preuve en est le fichier 'Acces Apache', mais j'ai une erreur style 'Request failed: error reading the headers', fichier 'Fichier log->erreur Apache'. Pour tenter le coup, je met tout le texte a envoyer dans une seule chaine, et je ne fais qu'un seul send(). Et ca a marché...Le script php recupere bien les données, et s'execute parfaitement.....
Pour l'envois de fichiers, apres avoir passer du temps a mater les aides et rfc sur les requetes http, on voit qu'une telle requette se decoupe ainsi:
POST LA OU JE VEUX.php HTTP/1.1\r\n
Host: 127.0.0.1\r\n
Content-Type: multipart/form-data; boundary=---6G+f\r\n
Content-length:218\r\n\r\n-----6G+f\r\n
Content-Disposition: form-data; name='fichier'; filename='C:\\test.txt'\r\n
Content-type:text/plain\r\n
\r\nCeci est un test!!!\r\n
-----6G+f--\r\n
(j'ai mis le \r\n passsssque Apache, il est assez pointilleux avec ces trucs....).
le boundary, c'est un separateur que tu defini toi meme, mais faut penser a rajoutter '--' devant, pour indiquer le debut d'un block , et '--' au dernier que tu utilises (fin du message)
Et pareil, un seul send().
Voila, ca marche chez moi, j'espere que ca te mettrra au moins sur la voie....
0
cs_seed Messages postés 99 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 19 mars 2005
25 mars 2004 à 21:02
j'ai un petit problème chez moi je n'arrive pas à envoyer une requete POST.
J'ai enlevé le bind et j'ai créer un page test.php qui dès qu'elle est lancé crée un fichier texte contenant la variable $_POST['var'].
je lance le programme mais rien ne se passe même dans les logs Acces de Apache (easyphp) rien du tout.

voici le code :
//-----------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;

sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sock = socket(AF_INET,SOCK_STREAM,0);
printf("\n\n -> CONNEXION OK");

send(sock,"POST test.php HTTP/1.1\r\n",23,0);
send(sock,"Host: 127.0.0.1\r\n",23,0);
send(sock,"Content-Type: application/x-www-form-urlencoded\r\n",48,0);
send(sock,"Content-Length: 11\r\n",20,0);
send(sock,"\r\n",2,0);
send(sock,"var=canaris\r\n",13,0);
send(sock,"\r\n",2,0);

printf("\n\n -> TRANSFERT OK");
getch();
closesocket(sock);
WSACleanup();
}
//-----------------------------------------------------------
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nomodie Messages postés 6 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 8 juin 2004
25 mars 2004 à 22:17
dis moi, t'aurais pas oublié:
if(connect(sock,(SOCKADDR*)&sin,sizeof(sin))==0)//connection a un serveur
juste avant de faire tes send par hasard?
0
cs_seed Messages postés 99 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 19 mars 2005
27 mars 2004 à 10:27
OUps en effet j'avais recopier le code sans trop y faire attention par contre chez moi php ne recoit aucune variables POST si j'envoie la requete avec plusieurs sends comme dans le script de amodels

mais sinons si je mets tous dans une chaine de caracteres ca marche nikel.

MERCi
0
nomodie Messages postés 6 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 8 juin 2004
27 mars 2004 à 11:26
Ouaip, Apache semble pointilleux sur les requetes envoyées, mais il est possible qd meme de decouper une requete (notament qd on envoie des fichiers), il faut juste tester les 'decoupes' pour trouver ce qu'il accepte.
Au fait, tant que j'y pense, si vous voulez envoyer des fichiers avec vos requetes du type image par exemple, penser a ouvrir les fichiers en mode binaire et a utiliser des pointeurs 'void' pour recuperer les infos du fichiers et les balancer, sinon, vous vous retrouverez comme moi a avoir des fichiers gif imcomplet (passssque char interprete certain caracteres, comme le caractere null, et il peut tres bien (toujours?) y avoir de tels caracteres dans un fichier image.
Par exemple:
void content=malloc(taillefichier));
memset(content,0x00,taille);
//lecture du fichier
fread(content, 1, taille, fp );
//envois le fichier
send(sock,(char*)content,taille,0);
et la, ca me regle le probleme.
0
Rejoignez-nous