什么是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 : 需要在表单中进行文件上传时,就需要使用该格式。
|
常见类型
(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
|
常见的post数据提交的方式,使用表单上传文件时,必须让form的enctype等于该值。
enctype属性:
enctype:规定了form表单在发送到服务器时候编码方式,它有如下的三个值。
- application/x-www-form-urlencoded:默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得效率低下。
- multipart/form-data:指定传输数据为二进制类型,比如图片、mp3、文件。
- 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>
|