什么是content-type

Content-type首部字段说明了实体主体的MIME类型。

content-type(MediaType),即Internet Media Type,互联网媒体类型,也称为MIME类型。在互联网中有成百上千中不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签,用于区分数据类型。

Content-Type是HTTP的实体首部字段,用来表示请求或响应中的媒体类型。它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等

Conten-type格式

Content-type:type/subtype;parameter
- type:主类型,任意的字符串,人text,如果是*号代表所有
- subtype:子类型,任意的字符串,如html,如果是*号代表所有,用“/”与主类型隔开
- parameter:可选参数,如charset,boundary等

例如:

Content-type: text/html

Content-type: application/json; charset:utf-8

常见的Content-type类型

以text开头的媒体格式类型

text/html:HTML格式
text/plain:纯文本格式
test/xml:XML格式 (什么是XML?指可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据

以image开头的媒体格式类型

image/gif:gif图片格式
image/jpeg:jpg图片格式
image/png:png图片类型

以application开头的媒体格式类型

application/xhtml+xml: XHTML格式
application/xml:XML数据格式
application/atom+xml:Atom XML聚合格式
application/json:JSON数据格式
application/pdf:pdf格式
application/octet-stream:二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded:<form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)。

另外还有一种常见的媒体格式是上传文件之时使用的:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式。

常见类型

application/x-www-form-urlencoded

(1) 浏览器的原生form表单

(2) 提交的数据按照key1=val1&key2=val2的方式进行编码,key和val都进行URL转码

POST /dvwa/login.php HTTP1.1
Upgrade-Insecure-Requests: 1
Origin: http://10.160.15.105
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Login=Login&password=admin&username=admin

multipart/form-data

常见的post数据提交的方式,使用表单上传文件时,必须让form的enctype等于该值。

enctype属性:

enctype:规定了form表单在发送到服务器时候编码方式,它有如下的三个值。

  1. application/x-www-form-urlencoded:默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得效率低下。
  2. multipart/form-data:指定传输数据为二进制类型,比如图片、mp3、文件。
  3. text/plain:纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。
<form enctype="multipart/form-data" action="#" method="POST" />
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose an image to upload:
<br/>
<input name="uploaded" type="file" /><br />
<br/>
<input type="submit" name="Upload" value="Upload" />
</form>

请求头示例:(以下为上传xml文件)

POST /dvwa/vulnerabilities/upload/ HTTP/1.1
Host: 1.1.1.1
Connection: keep-alive
Content-Length: 1311
Cache-Control: max-age=0
Origin: http://1.1.1.1
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryhrzKECyteqHqat1e
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://1.1.1.1/dvwa/vulnerabilities/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: security=low;acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada; PHPSESSID=ij584g37d4f14n6gv872mth7b0; x-s3-sid=>rn`yh6vsgm0dhtp/R1e3v30y; x-s3-rtk=Tr20uent76gJdi1hwE6szylhW524o49eUR4439; x-s3-tid=9c3321c9b97c96f78e8bda2351ef7f34c7250918:ylhW52_Pe3B:190a1755-e092-11ea-8767-5d01a268a33a:ae97f50468

------WebKitFormBoundaryhrzKECyteqHqat1e
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryhrzKECyteqHqat1e
Content-Disposition: form-data; name="uploaded"; filename="test.xml"
Content-Type: text/xml

<?xml version="1.0" encoding="utf-8"?>
<XMLReport name="test" xml_export_version="1.0">
<summary>
<url>http://www.baidu.com/</url>
<server_type>None</server_type>
<scan_mode>0</scan_mode>
<profile_name>...........................</profile_name>
<time>
<scan_begin>2019/04/10 01:39:52</scan_begin>
<scan_end>2019/04/10 01:40:23</scan_end>
<scan_duration>31s</scan_duration>
</time>
<total_urls/>
<total_vulns>
<total_serious_vulns>0</total_serious_vulns>
<total_high_vulns>0</total_high_vulns>
<total_medium_vulns>0</total_medium_vulns>
<total_low_vulns>0</total_low_vulns>
</total_vulns>
</summary>
<vuln_items/>
<server_information>
<host>http://www.baidu.com/</host>
<server_type/>
<total_urls num="0"/>
<external_urls num="0"/>
</server_information>
</XMLReport>

------WebKitFormBoundaryhrzKECyteqHqat1e
Content-Disposition: form-data; name="Upload"

Upload
------WebKitFormBoundaryhrzKECyteqHqat1e--

首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。
然后 Content-Type 里指明了数据是以 multipart/form-data 来编码,本次请求的 boundary 是什么内容。

消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 –boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。

如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。

application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。

multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分

text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。

form 的enctype属性为编码方式,常用有两种:

application/x-www-form-urlencoded和multipart/form- data,默认为application/x-www-form-urlencoded。

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1& amp;name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。

当action为post时候,浏览器把form数据封装到http body中,然后发送到server。

如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上 Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件 name)等信息,并加上分割符(boundary)。

application/json

消息主体是序列化后的JSON字符串

POST / HTTP/1.1  
Content-Type: application/json;charset=utf-8

{"title":"test","sub":[1,2,3]}

text/xml

一种使用http作为传输协议,XML作为编码方式的远程调用规范

POST [http://www.example.com](http://www.example.com) HTTP/1.1 
Content-Type: text/xml
<!--?xml version="1.0"?-->
<methodcall>
<methodname>examples.getStateName</methodname>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodcall>