2011-09-26 3 views
8

Si je mis en place une page html avec le formulaire suivant:Envoi d'un fichier via POST en utilisant HTTP brut (Putty)

<html> 
<body> 

<form action="upload_file.php" method="post" 
enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="file" id="file" /> 
<br /> 
<input type="submit" name="submit" value="Submit" /> 
</form> 

</body> 
</html> 

Je peux télécharger un fichier à upload_file.php où je peux le manipuler en utilisant un php scénario.

À des fins de test, j'ai besoin de faire de même avec du HTTP brut via une session Putty.

Je peux faire le POST (juste envoyer des données texte) ainsi:

POST /test_post.php HTTP/1.1 
Host: example.com 
User-Agent: Mozilla/5.0 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 11 

name=myname 

Comment puis-je envoyer un fichier de cette façon?

Répondre

14

Vous devez utiliser multipart-type de contenu et coder les données de fichier dans hexadécimal/binaire

Effectuez les opérations suivantes dans telnet:

POST /the_url HTTP/1.1 
User-Agent: Mozilla 
Host: www.example.com 
Content-Length: xxxx 
Content-Type: multipart/form-data; boundary=--------------------31063722920652 
------------------------------31063722920652 
Content-Disposition: form-data; name="a" 

value_for_a 
------------------------------31063722920652 
Content-Disposition: form-data; name="b" 

value_for_b 
------------------------------31063722920652 
Content-Disposition: form-data; name="c"; filename="myfile.txt" 
Content-Type: text/plain 

      This is a test 
      and more 

-----------------------------31063722920652 
Content-Disposition: form-data; name="submit" 

Submit 
-----------------------------31063722920652-- 

Rappelez-vous qu'une nouvelle ligne supplémentaire est nécessaire entre le nom de domaine et son Les données. Mettez également à jour la valeur Content-Length.

+0

Comment accepter le fichier dans la nouvelle longueur de contenu? Est-ce que ce sera la taille du fichier en octets? – xbonez

+1

J'ai complété les données brutes dans ma réponse. Il contient maintenant une charge utile de fichier texte. Content-Length sera la taille complète de la charge utile (y compris le fichier) en octets –

+0

Content-Length est la taille en octets des données qui sont envoyées à partir de la première «borne» jusqu'à la dernière. –

4

Ouvrir un port avec netcat et enregistrez la requête entrante:

nc -l -p 1090 > income-http.txt 

Modifiez ensuite votre formulaire pour envoyer les données au netcat:

<form action="http://localhost:1090/upload_file.php" 
    method="post" enctype="multipart/form-data"> 

Soumettre le formulaire de votre navigateur. Vous pouvez trouver la requête brute complète avec le contenu du fichier dans le fichier income-http.txt.

L'enregistrement de income-http.txt est une activité unique. Plus tard, vous pouvez envoyer la demande enregistrée à tout moment. Notez que vous devez modifier l'en-tête Host: dans le fichier txt enregistré.

+0

J'aime vraiment l'idée de pouvoir analyser la requête entrante. Mais malheureusement, l'ouverture d'un port n'est pas une option pour moi. Y a-t-il une alternative à cela? – xbonez

+1

Vous devez le faire seulement sur votre machine locale et seulement une fois. Après avoir obtenu le revenu-http.txt vous pouvez l'envoyer n'importe quand. – palacsint

+0

Oh, vous voulez dire que j'ouvre le port sur la machine locale et que je n'ai pas besoin de le transférer sur le routeur? Je n'ai pas accès au routeur. Je vais donner un coup de netcat. – xbonez

Questions connexes