本文中,我将向您介绍HTTP的基础知识。
为什么我应该阅读有关您可能会问自己的HTTP?
那么,如果你是一个软件开发者,你就会明白如何通过学习他们如何沟通来编写更好的应用程序。如果您是系统架构师或网络管理员,您将会对设计复杂的网络架构有更深入的了解。
当今非常重要的架构风格REST完全依赖于HTTP功能,因此使HTTP更加重要。如果你想制作很好的RESTful应用程序,你必须先了解HTTP。
我不应该认为REST不仅仅依赖于HTTP。它可以使用其他协议来实现,但HTTP似乎远胜于此,并且很难找到使用其他协议的REST实现。
那么你是否愿意传递机会去理解和学习万维网和网络通信的基本概念?
本文将重点介绍HTTP中最重要的部分,并试图尽可能简单地解释它们。这个想法是在一个地方组织所有有关HTTP的有用信息,为您节省阅读书籍和RFC的时间以找到您需要的信息。
毫不迟疑,让我们潜入。
HTTP的创始人是Tim Berners-Lee (该人也被认为是万维网的发明人)。其他对HTTP开发很重要的名字还有Roy Fielding,他也是REST架构风格的创始人。
超文本传输协议是应用程序用来相互通信的协议。本质上,HTTP负责委托客户端和服务器之间的所有互联网媒体文件。这包括HTML,图像,文本文件,电影和其中的一切。它可以快速可靠地完成这项工作。
HTTP是 应用程序协议而不是传输协议,因为它用于应用程序层的通信。在这里慢跑你的记忆是网络堆栈的样子。
从这张图片中,您可以清楚地看到HTTP是应用程序协议,并且TCP在传输层上工作。
互联网上的所有内容都是资源,HTTP与资源一起工作。这包括文件,流,服务和其他一切。一个HTML页面是一个资源,一个YouTube视频是一个资源,一个Web应用程序的日常任务的电子表格是一个资源...你明白了。
你如何区分一种资源与另一种资源?
通过给他们URL(统一资源定位器)。
URL指向可以找到资源的唯一位置。
在WEB客户端和WEB服务器之间如何交换消息
每一个内容,每个资源都存在于某个Web服务器(HTTP服务器)上。这些服务器正在等待这些资源的HTTP请求。
但是,您如何从Web服务器请求资源?
当然你需要一个HTTP客户端
您现在正在使用HTTP客户端来阅读本文。Web浏览器是HTTP客户端。他们与HTTP服务器通信以将资源提取到您的计算机。一些最受欢迎的客户是Google的Chrome,Mozilla的Firefox,Opera,Apple的Safari,不幸的是仍然是臭名昭着的Internet Explorer。
消息和一些消息示例
那么HTTP消息是什么样的?
不用太多地谈论它,下面是一些HTTP消息的例子:
GET请求
GET/repos/CodeMazeBlog/ConsumeRestfulApisExamples HTTP/1.1
Host:api.github.com
Content-Type:application/json
Authorization:Basic dGhhbmtzIEhhcmFsZCBSb21iYXV0LCBtdWNoIGFwcHJlY2lhdGVk
Cache-Control:no-cache
POST请求
POST/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks?access_token=5643f4128a9cf974517346b2158d04c8aa7ad45fHTTP/1.1
Host:api.github.com
Content-Type:application/json
Cache-Control:no-cache
{
"url":"http://www.example.com/example",
"events":[
"push"
],
"name":"web",
"active":true,
"config":{
"url":"http://www.example.com/example",
"content_type":"json"
}
}
以下是一个GET和一个POST请求的示例。让我们快速浏览这些请求的不同部分。
该请求的第一行是为请求行保留的。它由 请求方法名称,请求URI和 HTTP版本组成。
接下来的几行代表请求头。请求标头为请求提供了额外的信息,例如请求期望响应的内容类型,授权信息等,
对于GET请求,故事就此结束。一个POST请求也可以有一个主体并且以主体消息的形式携带额外的信息。在这种情况下,它是一个JSON消息,其中包含有关如何为URI中指定的repo创建GitHub webhook的其他信息。该消息是webhook创建所必需的,因此我们使用POST请求将该信息提供给GitHub API。
请求行和请求头必须后跟(回车和换行符\ r \ n),并且消息头和消息正文之间仅包含一条仅包含CRLF的空行。
HTTP请求参考:https: //www.w3.org/Protocols/rfc2616/rfc2616-sec5.html
作为对这些要求的回应,我们得到了什么?
HTTP/1.1200OK
Server:GitHub.com
Date:Sun,18Jun201713:10:41GMT
Content-Type:application/json;charset=utf-8
Transfer-Encoding:chunked
Status:200OK
X-RateLimit-Limit:5000
X-RateLimit-Remaining:4996
X-RateLimit-Reset:1497792723
Cache-Control:private,max-age=60,s-maxage=60
[
{
"type":"Repository",
"id":14437404,
"name":"web",
"active":true,
"events":[
"push"
],
"config":{
"content_type":"json",
"insecure_ssl":"0",
"url":"http://www.example.com/example"
},
"updated_at":"2017-06-18T12:17:15Z",
"created_at":"2017-06-18T12:03:15Z",
"url":"https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404",
"test_url":"https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404/test",
"ping_url":"https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404/pings",
"last_response":{
"code":422,
"status":"misconfigured",
"message":"Invalid HTTP Response: 404"
}
},
]
响应消息的结构与请求相同,只是第一行称为 状态行,它令人惊讶,其中包含有关响应状态的信息。
状态行后面跟着响应头和响应主体。
HTTP响应参考:https: //www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
MIME类型被用作标准化的方式来描述互联网上的文件类型。您的浏览器具有MIME类型列表,Web服务器也是如此。这样,无论操作系统如何,文件都可以以相同的方式传输。
有趣的是,MIME代表多用途Internet邮件扩展,因为它们最初是为多媒体电子邮件而开发的。自那以后,它们被改编用于HTTP和其他一些协议。
每种MIME类型都由以下格式的类型,子类型 和可选参数 列表组成 : type / subtype; 可选参数。
这里有一些例子:
Content-Type:application/json
Content-Type:text/xml;charset=utf-8
Accept:image/gif
您可以在HTTP参考中找到常用MIME类型和子类型的列表 。
HTTP请求方法(也称为“动词”)定义将在资源上执行的操作。HTTP定义了几种请求方法。最常用的/使用的是GET和POST方法。
请求方法可以是幂等的或不是幂等的。这仅仅是解释该方法在同一资源上被多次调用的安全/不安全的一个奇特术语。换句话说,这意味着只有检索信息的GET方法默认应该是幂等的。一次又一次调用同一资源上的GET应该不会导致不同的响应。另一方面,POST方法不是一个幂等方法。
在HTTP / 1.1之前,只有三种方法:GET,POST和HEAD,并且HTTP / 1.1的规范带来了更多的方法: OPTIONS,PUT,DELETE,TRACE和CONNECT。
在HTTP参考中查找更多这些方法的工作原理 。
标题字段是可以在请求或响应消息的第一行之后找到的以冒号分隔的名称值字段。它们为HTTP消息提供了更多的上下文,并确保客户端和服务器得到适当的关于请求或响应性质的信息。
有五种类型的标题:
常规标题: 这些标题对服务器和客户端都有用。日期标题字段就是一个很好的例子,它提供了有关创建消息的时间的信息。
请求标头: 特定于请求消息。他们向服务器提供更多信息。例如, Accept:* / *标头字段通知服务器客户端愿意接收任何媒体类型。
响应标头: 特定于响应消息。他们向客户提供附加信息。例如, 允许:GET,HEAD,PUT标题字段通知客户端哪些方法被允许用于请求的资源。
实体标头: 这些标头处理实体主体。例如, Content-Type:text / html 头让应用程序知道数据是HTML文档。
扩展头文件: 这些是由应用程序开发人员构建的非标准头文件。它们不是HTTP的一部分,但需要被容忍。
您可以在HTTP参考中找到常用请求和响应头的列表 。
状态代码就是一个表示请求的结果的三位数。紧接着是人类可读的状态码解释的原因短语。
一些例子包括:
200 OK
404未找到
500内部服务器错误
状态代码按五个不同组别的范围进行分类。
状态码分类和状态码的完整列表及其含义可以在HTTP参考中找到 。
唷,那是很多的信息。
通过学习HTTP获得的知识不是可以帮助您直接解决某些问题的那种知识。但是它让你了解互联网通信的基本原理,你可以将它应用于比HTTP更高层次的几乎所有其他问题。无论是REST,API,Web应用程序开发还是网络,您现在都可以在解决这些问题时至少更有信心。
当然,HTTP是一个相当大的话题,而且它的基本概念还有很多。
在HTTP系列的第2部分中了解HTTP的体系结构方面。
这篇文章对你有帮助吗?请留下评论,并让我知道。
例
带有两个源文件的音频播放器。浏览器需要选择它所支持的源文件(如果都支持则任选一个):
<audiocontrols><sourcesrc="horse.ogg"type="audio/ogg"><sourcesrc="horse.mp3"type="audio/mpeg"> 您的浏览器不支持 audio 元素。</audio>
浏览器支持
IE 9+、Firefox、Opera、Chrome 和 Safari 都支持 <source> 标签。
注释:IE 8 或更早版本的 IE 浏览器都不支持 <source> 标签。
标签定义及使用说明
<source> 标签为媒体元素(比如 <video> 和 <audio>)定义媒体资源。
<source> 标签允许您规定两个视频/音频文件共浏览器根据它对媒体类型或者编解码器的支持进行选择。
HTML 4.01 与 HTML5之间的差异
<source> 标签是 HTML5 中的新标签。
属性
New:HTML5 中的新属性。
属性 | 值 | 描述 |
---|---|---|
mediaNew | media_query | 规定媒体资源的类型,供浏览器决定是否下载。 |
srcNew | URL | 规定媒体文件的 URL。 |
typeNew | MIME_type | 规定媒体资源的 MIME 类型。 |
全局属性
<source> 标签支持 HTML 的全局属性。
事件属性
<source> 标签支持 HTML 的事件属性。
如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!
录-常见web安全问题
文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
在了解文件上传漏洞之前先了解什么是Web容器、IIS、文件解析。
什么是web容器?
web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如tomcat、apache、nginx等等。(可以理解为给编程语言提供环境)
中间件:提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。
容器:给处于其中的应用程序组件(ASP,JSP,PHP)提供一个环境。使处于其中的应用程序组件之间跟容器中的环境变量接口交互,不必关注其他系统问题。
服务器:www服务器或http服务器。提供web信息游览服务。它只需支持http协议、html文档格式以及url,向浏览器提供服务的程序。
什么是IIS?
IIS全称是互联网信息服务,包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服务。
.net Framework是基础类库,是程序运行的底层框架。
IIS是架设Web服务器用来提供网页游览服务的,属于系统环境。
一般用ASP.NET开发软件,然后靠IIS对公网提供服务。
什么是文件解析?
当服务器接收到一个HTTP请求的时候,IIS首先需要决定如何去处理这个请求(服务器处理.aspx和.html肯定是不一样的),根据的是文件的后缀名。
服务器获取所请求的页面(也可以是文件)的后缀名后接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,那么IIS将直接把这个文件返还给客户端。
攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起。所以我们首先来了解一下解析漏洞,这样才能更深入地了解上传漏洞,并加以防范。
常见的Web容器有ⅡS、Apache、Nginx、Tomcat等,下面主要讲IIS、Apache容器。
IIS解析漏洞
IIS 6.0在解析文件时存在以下两个解析漏洞。
Apache解析漏洞
Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断,如xxx.php.owf.rar ,”.owf”和”.rar”这两种后缀是apache解析不了的,apache就会把xxx.php.owf.rar解析成php。
怎么去判断是不是合法的后缀就是这个漏洞利用关键,测试时把常见的后缀都写上,去测试是不是合法,任意不识别的后缀,逐级向上识别。
有些程序开发人员在上传文件时,判断文件名是否是PHP、ASP、ASPX、ASA、CER、ASPX等脚本扩展名,如果是,则不允许上传,这时攻击者就有可能上传1.php.rar等扩展名来绕过程序检测,并配合解析漏洞,获取到WebShell。
绕过上传漏洞分以下两种。
客户端检测:客户端使用JavaScript检测,在文件未上传时,就对文件进行验证;
服务器端检测:服务端脚本一般会检测文件的MIME类型,检测文件扩展名是否合法,
甚至有些程序员检测文件中是否嵌入恶意代码。
在研究上传漏洞之前,首先来看两个小工具:中国菜刀和一句话图片木马。
“中国菜刀”这款软件是用来管理网站文件的,非常小巧灵活,它仅仅需要一段简短的代码
就可以方便地管理网站。中国菜刀现在已经成为安全研究者手中必备的利器,其官方网站为:http://www.maicaidao.com。
该软件提供的服务器端文件仅有一行代码。目前支持的服务器端脚本包括:PHP、ASP、ASP.NET、JSP等,并且支持HTTPS安全连接的网站。常见的代码如下:
Asp一句话:<%eval request(“xxx”)%>
Php 一句话:<%php @eval($_POST[xxx]);?>
Aspx一句话:<%@ Page Languag=”xxx”%><%eval(Request.Item[“xxx”])%>
正因为代码短小精悍,所以被黑客称为一句话木马(一句话后门)。
将<?php @eval(S_POST['xxx']);?>保存为shell.php,上传至PHP主机空间中,配置菜刀进行连接,如图所示。
“图片一句话”则是将一句话木马插入在图片文件中,而且并不损坏图片文件,这一方法可以躲过少许的防火墙检测。制作图片一句话木马的方法非常多,目前已经有安全研究人员设计出了专业的制作软件:Edjpgcom。Edjpgcom的使用方法非常简单:把一张正常的图片拖到Edjpgcom.exe程序中,填写相应的一句话代码,就可以制作图片一句话木马。
在插入一句话木马之后,以文本的方式打开图片,就可以看到一句话木马代码就在里面,而且不影响图片正常预览。
还有将一句话木马与正常图片通过CMD命令结合起来。
注:如果直接以文本的方式打开图片插入一句话,可能会造成文件损坏。
知道了程序员是如何防护上传漏洞及一句话图片木马后,下面深入研究攻击者是如何绕过程序员的防护思维来上传一句话木马文件的。
客户端检测
使用FileBug浏览器插件
FireBug是一款开源的浏览器插件,它支持Firefox、Chrome等浏览器。它可以让Web开发者轻松地调试HTML、JavaScript、AJAX、CSS等前端脚本代码,属于Web开发人员的必备武器。正由于FireBug功能强大,所以也被黑客认为是必备利器。
中间人攻击
中间人攻击这种方式与FireBug完全不同,FireBug是删除客户端的JavaScript验证,而使用Burp Suite则是按照正常的流程通过JavaScript验证,然后在传输中的HTTP层做手脚。
首先把木马文件扩展名改为一张正常图片的扩展名,比如JPG扩展名,在上传时使用Burp Suite拦截上传数据,再将其中的扩展名JPG修改为PHP,就可以绕过客户端验。
服务器端检测
白名单与黑名单验证
(1)黑名单过滤方式
黑名单过滤是一种不安全的方式,黑名单定义了一系列不安全的扩展名,服务器端在接收文件后,与黑名单扩展名对比,如果发现文件扩展名与黑名单里的扩展名匹配,则认为文件不合法。
(2)白名单过滤方式
白名单的过滤方式与黑名单恰恰相反,黑名单是定义不允许上传的文件扩展名,而白名单则是定义允许上传的扩展名,白名单拥有比黑名单更好的防御机制。如:$WhiteList=
array(rar’,jpg’,png,bmpy,gif,jpg;doc);在获取到文件扩展名后对 WhiteList数组里的扩展名迭代判断,如果文件扩展名被命中,程序将认为文件是合法的,否则不允许上传。
MIME验证
MIME类型用来设定某种扩展名文件的打开方式,当具有该扩展名的文件被访问时,浏览器会自动使用指定的应用程序来打开。如GIF图片MIME为image/gif,CSS文件MIME类型为text/ess。
目录验证
在文件上传时,程序通常允许用户将文件放到指定的目录中,然而有些Web开发人员为了让代码更“健壮”,通常会做一个操作,如果指定的目录存在,就将文件写入目录中,不存在则先建立目录,然后写入。
截断上传攻击
文件名后缀有一个%00字节,可以截断某些函数对文件名的判断。在许多语言函 数中,处理字符串的函数中0x00被认为是终止符
例如: 网站上传函数处理xxx.asp%00.jpg时,首先后缀名是合法的jpg格式,可以 上传,在保存文件时,遇到%00字符丢弃后面的 .jpg,文件后缀最终保存的后缀 名为xxx.asp
首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。 其次,用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。 最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
防范文件上传漏洞常见的几种方法:
1.文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2.判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3.使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4.单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
5.限制上传文件大小
限制上传文件的大小,防止由于内存、磁盘耗尽造成的拒绝服务。
可以配置web server允许的最大Post大小。
可以在代码层面获取上传文件的大小,根据文件类型的不同进行进一步的过滤。
6.确保上传文件被访问正确返回
1.将文件上传目录设置为静态资源目录,防止被解析为脚本执行。
2.使用代理页面隐藏文件真实路径。
3.使用上述方法时,确保Content-Type与实际文件类型一致。
4.如果文件不允许在页面展示,仅允许下载,请设置Content-disposition:attachment。
备注:
这篇文章摘抄来自网络。我打算总结一些列架构师需要的优秀文章,由于自己写会花太多时间,我决定做一个搬运工,为大家筛选优秀的文章,最后我会做成索引方便大家查找。
*请认真填写需求信息,我们会在24小时内与您取得联系。