2011-09-26 71 views
8

通過POST發送文件。如果我成立了一個HTML頁面的格式如下:使用原始HTTP(膩子)

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

我可以將文件上傳到upload_file.php在那裏我可以使用PHP處理它腳本。

出於測試目的,我需要通過Putty會話使用原始HTTP執行相同的操作。

我可以做一個正常的POST(只是發送文本數據)這樣說:

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 

我怎麼能發送這樣一個文件?

回答

14

你必須使用multipart內容類型和文件數據編碼爲十六進制/二進制

嘗試在遠程登錄如下:

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

記住額外的換行符是字段名之間必要的數據。另外,更新Content-Length值。與netcat的

+0

如何容納新內容長度中的文件?它是以字節爲單位的文件大小嗎? – xbonez

+1

我已經完成了我答案中的原始數據。它現在包含一個文本文件有效載荷。 Content-Length是以字節爲單位的有效負載(包括文件)的完整大小。 –

+0

Content-Length是從第一個「邊界」開始直到最後一個的數據的大小(以字節爲單位)。 –

4

打開一個端口,並保存傳入的請求:

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

然後修改您的形式將數據發送到netcat的:

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

從瀏覽器提交表單。您可以在income-http.txt文件中找到文件內容的完整原始請求。

保存income-http.txt是一次性活動。稍後,您可以隨時發送保存的請求。請注意,您應該在保存的txt中編輯Host:標題。

+0

我真的很喜歡能夠分析傳入請求的想法。但不幸的是,開放港口不是我的選擇。有沒有其他選擇? – xbonez

+1

你必須在你的本地機器上只做一次。獲得收入-http.txt後,您可以隨時發送。 – palacsint

+0

噢,你的意思是我打開本地機器上的端口,不必在路由器上轉發它?我無法訪問路由器。我會給netcat一個鏡頭。 – xbonez