取消
显示结果 
搜索替代 
您的意思是: 
cancel
1878
查看次数
0
有帮助
0
评论
julianchen
Spotlight
Spotlight
引言:作为开发者,您可以通过本文了解到如何通过处理HTTP请求和cookies,来保障您的web应用安全,并防止CSRF(跨站请求伪造)攻击。


在您浏览某个网站时,该网站经常会以您的名义向另一个网站请求各种数据。例如,在大多数情况下,某个网站上所显示的视频一般不会存储在网站本地。而该视频之所以可以出现在该网站上,是因为它实际上是从诸如youtube.com之类的视频流媒体网站所嵌入过来的。这就是所谓的内容分发网络(CDN),它能用于更快速度地交付各种内容与作业。通常许多网站都会将脚本、图像和其他带宽密集型的资源存放在CDN上,因此当您浏览图像和脚本文件时,它们会从最近的CDN资源进行下载,而并非来自网站本身。
虽然上述方法对于用户良好的浏览体验是必需的,但是它们也可能会成为各种安全问题的源头。因为您正在浏览的网站能够通过请求浏览器,在未经您同意的情况下从另一个网站上获取数据。而如果此类的请求并未正确处理的话,攻击者就可以会发动跨站请求伪造攻击。



跨站请求的危害


当一个网站以您的名义向另一个网站请求数据时,只要请求无需认证,例如并未发送会话cookie,那么就会不存在安全问题。然而当用户的会话cookie连同请求一并被发送时,攻击者就能发动跨站请求伪造攻击,进而滥用受攻击浏览器与Web服务器之间的信任关系。


在本文中,我们将重点讨论浏览器行为所引发的危险,以及攻击者是如何利用这个“优势”,来发动跨站请求伪造攻击的。为了理解跨站请求伪造的工作原理,让我们首先对HTTP请求和cookies做一个简单的介绍。

HTTP请求和WebCookies的简要介绍


HTTP的GET和POST请求


HTTPGET请求


HTTP GET请求就是您对一个web服务器数据的请求。例如,当您在Web浏览器中输入网址(URL)时,就是指示浏览器发送一个HTTP GET请求到该网站所对应的Web服务器上。相应地,该Web服务器也会发送响应回到浏览器端。


HTTPPOST请求


HTTP POST请求是指您发送那些要在Web应用中发布的数据。例如:当您提交web表单时,如果这是一个登录或交互的表单,那么您的浏览器就会产生一个HTTP POST请求。该HTTP POST请求包含着您通过Web表单所提交的数据。


自动生成HTTP GET和POST请求


有时候GET和POST请求能通过某些HTML标签,或者一段JavaScript代码来自动触发。因此,它们并非总是需要与用户交互的。例如:在src属性中被声明为图像链接的标签,就会自动生成一个GET请求。另一个例子则是XHR POST请求,它在用户输入查询时,被用于自动获取各种下拉式的搜索提示。


网站与会话Cookie


一般网站使用cookies来识别用户,或是在网站上保留用户的登录会话。会话cookie通常包含着唯一的ID,web应用程序将用它作为标识号,以判定那些已经完成登录了的特殊用户。因此,当一个cookie被设置用于某个特定网站时,浏览器就会将它连同每一个发往该网站的HTTP请求,都保留在已登录的会话中。然而,这并非只关乎到会话cookie本身的问题。通过使用CSRF,就算Web服务器能够根据IP地址予以识别,攻击者仍然能够以用户的身份,使用NTLM或Basic Auth的认证方式来发送各种请求。

跨站请求伪造的工作原理


由于跨站点请求不需要您的批准,攻击者就可以滥用它,并且在未经您的同意和知晓的情况下,发送各种请求。下面是的一个典型场景,让我们看看这个问题是如果被暴露出来的。


Web表单的简介


我们来试想一个能够允许您去修改电子邮件地址的网站。您所要做的就是:在您登录之后,将您新的地址写入上述的字段,并点击“更改”。而如果您还没有登录,也就是说,在您并没有会话cookie的时候,该表单是不会工作的。下面让我们来看看底层的HTML代码是如何让这个输入字段工作的:



Your new email address









在上述Web表单代码中,有三个重要的HTML属性:method、action和name。


Method属性


HTML的method属性是用来指定要用到的HTTP动作,并且在默认情况下,就是GET。当使用GET时,所有的参数值会被作为URL请求的一部分发送出去,因此在浏览器地址栏上,它们会在问号字符之后显示出来,如下所示:


https://www.example.com/mail.php?email=alice@example.com


这些请求会被记录到了Web服务器的日志文件,以及浏览器的历史记录中。因此,GET动作只能用于传输一些非敏感的信息,以及不做任何数据修改的操作(包括:插入、更新、删除等)。比如:表示您正在浏览的当前页面:?page=home。


HTTP的POST动作被经常用在各种典型的web表单里,因为它将数据作为请求的主体进行发送。因此,在服务器日志或浏览器历史记录中并无发送数据的记录。这就很适合于传输诸如密码这类的敏感和大量的数据。


Action属性


HTML的第二个属性是action,它指定了请求的目标。目标可以是网站内部或外部、甚至是在另一个域中的页面。在上面的代码示例中,该值为mail.php,这是一个PHP脚本,可让您改变电子邮件地址的名称。


Name属性


name属性是在Web表单的输入域中。它所包含的参数名称被用来存放您所提交的数据。因此,如果您输入alice@example.com,并点击提交按钮。那么mail的参数值将被设置为alice@example.com,同时Web服务器将收到如下的参数映射值:


mail=alice@example.com


HTTPPOST请求


一旦您提交了该表单,浏览器就会发送下面的HTTP请求:


POST /email.phpHTTP/1.1mail=alice@example.com
Host: example.com
Cookie: SESSION=e29a31e41c9512a4bd
Content-Type:application/x-www-form-urlencoded
mail=alice@example.com


如您所见,Host的HTTP头里包含了从表单提交过来的网站主机名。另外它还包括了会话cookie,Web应用可以籍此来确定您是否已经登录过。
入门指南

使用上面的搜索栏输入关键字、短语或问题,搜索问题的答案。

我们希望您在这里的旅程尽可能顺利,因此这里有一些链接可以帮助您快速熟悉思科社区:









快捷链接