English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 业界动态 >> Web框架与CSRF防御

 

Web框架与CSRF防御

威盾防火墙 2015-02-17

 

关于CSRF的攻击原理和防御方案,在本书"跨站点请求伪造"一章中有所阐述。在Web框架中可以使用security token 解决CSRF攻击的问题。

CSRF攻击的目标,一般都会产生"写数据"操作的URL,比如"增"、"删"、"改";而"读数据"操作并不是CSRF攻击的目标,因为在CSRF的攻击过程中攻击者无法获取到服务器端返回的数据,攻击者只是借用户之手触发服务器动作,所以读数据对于CSRF来说并无直接的意义(但是如果同时存在XSS漏洞或者其他的跨域漏洞,则可能会引起别的问题,在这里,仅仅就CSRF对抗本身进行讨论)。

因此,在Web应用开发中,有必要对"读操作"和"写操作"予以区分,比如要求所有的"写操作"都使用HTTP POST。

在很多讲述CSRF防御的文章中,都要求使用HTTP POST进行防御,但实际上POST本身并不足以对抗CSRF,因为POST也是可以自动提交的。但是POST的使用,对于保护token有着积极的意义,而security token的私密性(不可预测性原则),是防御CSRF攻击的基础。

对于Web框架来说,可以自动地在所有涉及POST的代码中添加token,这些地方包括所有的form表单、所有的Ajax POST请求等。

完整的CSRF防御方案,对于Web框架来说有以下几处地方需要改动。

(1)在Session中绑定token。如果不能保存到服务器端Session中,则可以替代为保存到Cookie里。

(2)在form表单中自动填入token字段,比如 <input type=hidden name="anti_csrf_token" value="$token" />。

(3)在Ajax请求中自动添加token,这可能需要已有的Ajax封装实现的支持。

(4)在服务器端对比POST提交参数的token与Session中绑定的token是否一致,以验证CSRF攻击。

在Rails 中,要做到这一切非常简单,只需要在Application Controller中增加一行即可:

  1. protect_from_forgery :secret => "123456789012345678901234567890..." 

它将根据secret和服务器端的随机因子自动生成token,并自动添加到所有form和由Rails生成的Ajax请求中。通过框架实现的这一功能大大简化了程序员的开发工作。

在Django中也有类似的功能,但是配置稍微要复杂点。

首先,将 django.middleware.csrf.CsrfViewMiddleware 添加到 MIDDLEWARE_CLASSES中。

  1. ('django.middleware.common.CommonMiddleware',  
  2.  'django.contrib.sessions.middleware.SessionMiddleware',  
  3.  'django.middleware.csrf.CsrfViewMiddleware',  
  4.  'django.contrib.auth.middleware.AuthenticationMiddleware',  
  5.  'django.contrib.messages.middleware.MessageMiddleware',)  
然后,在form表单的模板中添加token。
  1. <form action="." method="post">{% csrf_token %} 
接下来,确认在View层的函数中使用了django.core.context_processors.csrf,如果使用的是 RequestContext,则默认已经使用了,否则需要手动添加。
  1. from django.core.context_processors import csrf  
  2. from django.shortcuts import render_to_response  
  3.  
  4. def my_view(request):  
  5.     c = {}  
  6.     c.update(csrf(request))  
  7.     # ... view code here  
  8.     return render_to_response("a_template.html", c)  

这样就配置成功了,可以享受CSRF防御的效果了。

在 Ajax请求中,一般是插入一个包含了token的HTTP头,使用HTTP头是为了防止token泄密,因为一般的JavaScript无法获取到HTTP头的信息,但是在存在一些跨域漏洞时可能会出现例外。

下面是一个在Ajax中添加自定义token的例子。

  1. $(document).ajaxSend(function(event, xhr, settings) {  
  2.     function getCookie(name) {  
  3.         var cookieValue = null;  
  4.         if (document.cookie && document.cookie != '') {  
  5.             var cookies = document.cookie.split(';');  
  6.             for (var i = 0; i < cookies.length; i++) {  
  7.                 var cookie = jQuery.trim(cookies[i]);  
  8.                 // Does this cookie string begin with the name we want?  
  9.                 if (cookie.substring(0, name.length + 1) == (name + '=')) {  
  10.                     cookieValue = decodeURIComponent(cookie.substring(name.length + 1));  
  11.                     break;  
  12.                 }  
  13.             }  
  14.         }  
  15.         return cookieValue;  
  16.     }  
  17.     function sameOrigin(url) {  
  18.         // url could be relative or scheme relative or absolute  
  19.         var host = document.location.host; // host + port  
  20.         var protocol = document.location.protocol;  
  21.         var sr_origin = '//' + host;  
  22.         var origin = protocol + sr_origin;  
  23.         // Allow absolute or scheme relative URLs to same origin  
  24.         return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||  
  25.             (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||  
  26.             // or any other URL that isn't scheme relative or absolute i.e relative.  
  27.             !(/^(\/\/|http:|https:).*/.test(url));  
  28.     }  
  29.     function safeMethod(method) {  
  30.         return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));  
  31.     }  
  32.  
  33.     if (!safeMethod(settings.type) && sameOrigin(settings.url)) {  
  34.         xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));  
  35.     }  
  36. });  
在Spring MVC以及一些其他的流行Web框架中,并没有直接提供针对CSRF的保护,因此这些功能需要自己实现。
【责任编辑:book TEL:(010)68476606】


相关内容: 最新内容:
网页防篡改技术追踪[2015-02-17]
网站防篡改 立即部署WEB应用防火墙[2015-02-17]
带您了解SQL Server游标[2015-02-17]
SQL server服务器版的安装方法[2015-02-17]
防止SQL注入漏洞的方法[2015-02-17]
C#多态性的概念及其应用[2015-02-17]