AJax技术

《Pro ASP.NET MVC 3 Framework》学习笔记之三十三 【安全性】(4)

字号+ 作者:H5之家 来源:H5之家 2016-07-17 13:00 我要评论( )

由于我们常常把所有的注意力放在了XSS上,所以有时会忘记一个跟XSS具有同等破坏性的攻击:CSRF(跨站请求伪造)。这是一个非常基本和明显的攻击,但也常常被忽视。思考这样一个典型的站点:允许登录用户通过一个UserP

由于我们常常把所有的注意力放在了XSS上,所以有时会忘记一个跟XSS具有同等破坏性的攻击:CSRF(跨站请求伪造)。这是一个非常基本和明显的攻击,但也常常被忽视。思考这样一个典型的站点:允许登录用户通过一个UserProfileController的控制器管理他们的个人信息。如下:

View Code

public class UserProfileController : Controller { public ViewResult Edit() { var userProfile = GetExistingUserProfile(); return View(userProfile); } [HttpPost] public ActionResult Edit(string email, string hobby) { var userProfile = GetExistingUserProfile(); userProfile.Email = email; userProfile.Hobby = hobby; SaveUserProfile(userProfile); , ); } private UserProfile GetExistingUserProfile() {...} private void SaveUserProfile(UserProfile profile) {...} }

访问者初次访问的是没有参数的Edit(),会在<form>里面展示当前个性化的信息,然后提交给处理POST请求的Edit()并保存到数据库,这里没有XSS漏洞。

攻击(Attack)

看起来好像没什么危害,但是,任何人都可以通过诱导用户访问下面的HTML页来安装一个外部的攻击,如下:
<body>
    <form action="http://yoursite/UserProfile/Edit" method="post">
        <input value="hacker@somewhere.evil" />
        <input value="Defacing websites" />
    </form>
</body> 
当这个页面加载时,仅仅是发送一个验证的表单到到处理POST请求的Edit()。假定我们正在使用一些基于cookie的验证系统并且当前的用户有一个经过验证的cookie,他们的浏览器将发送这个请求,我们的服务器也会对这个请求采取相应的动作。现在,受害者的个人邮箱地址已经被攻击掌握了。可能这个例子看起来跟我们没有什么关系,考虑下其他的人通过发起一个HTTP请求可以利用我们程序的什么actions——能够购买一件商品?删除商品?转账汇款?发表文章?等等。

防御(Defense)

有两种策略来防御CSRF攻击:
1.验证HTTP引用的报头:Request.UrlReferrer如果不是我们期望出现的第三方的域名,就可以判断这个是跨站请求。浏览器不一定会发送报头,所以这种方式有时会没用。
2.在敏感的请求里指定必须的具体用户标志(token):如果我们让用户必须在每一个表单填写账户密码话,那么第三方是不能够伪造跨站请求的,但是这样会非常不方便用户的操作。
一个比较好的选择是让服务器生成一个秘密的用户标识并放在隐藏域里面,然后在表单提交的时候检查呈递的token。MVC框架里面已经有了对这个技术的实现:
使用Antiforgery辅助方法(Preventing CSRF Using the Antiforgery Helpers)
我可以结合MVC框架的 Html.AntiForgeryToken()与[ValidateAntiForgeryToken]过滤器来探测和阻止CSRF攻击。在实际表单包含Html.AntiForgeryToken()方法,如下:
@using(Html.BeginForm()) {
    @Html.AntiForgeryToken()
    ..........
}
页面显示为:
<form action="/UserProfile/Edit" method="post" >
    <input type="hidden" value="B0aG+O+Bi/5..." />
    ..........
</form>
同时Html.AntiForgeryToken()方法会给用户一个名称以__RequestVerificationToken打头的cookie。这个cookie包含与隐藏域相同的随机值,这些值在浏览会话中是不变的。
接着,我们必须通过添加[ValidateAntiForgeryToken]特性来验证提交的表单,如下:
[HttpPost]  
[ValidateAntiForgeryToken]
public ActionResult Edit(string email, string hobby)
{
    // ...
}
[ValidateAntiForgeryToken]是一个授权过滤器,用来检查请求里面的 __RequestVerificationToken的值和cookie的值是否匹配,如果不匹配会抛异常并阻止请求。这种方式可以阻止CSRF,因为即使潜在的受害者有一个__RequestVerificationToken的cookie,攻击者也不会知道随机值。并且用户也不会有什么不便,因为这种机制是静默的。
这种方式能够很好的运作,但我们需要知道相关限制:
1.浏览器必须接收cookie   2.必须是POST提交   3.如果有任何XSS漏洞,就很容易被绕过——因为这个漏洞允许攻击给定一个当前的__RequestVerificationToken值,然后再伪造一个POST提交,所以一定要注意XSS漏洞。

SQL注入(SQL Injection)

这部分大家应该比较熟悉了,所以略去。

安全地使用MVC框架(Using the MVC Framework Securely)

到目前为止,我们了解web应用程序常见的安全问题(攻击与防御)。但是还有一些需要我们注意的,就是滥用或误用MVC框架造成的危险。

不要偶然的暴露Action方法(Don’t Expose Action Methods Accidentally)

默认情况下,任何在控制器里面的public方法都是action方法并且依靠路由配置,能够被任何人调用。但这通常是程序员容易忘记的,例如,在下面的控制器,仅仅Change()方法是可以访问的。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • jQuery学习笔记之 Ajax操作篇(二)

    jQuery学习笔记之 Ajax操作篇(二)

    2016-06-07 18:03

  • Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器

    Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器

    2016-06-01 11:13

  • Ajax学习体验之一

    Ajax学习体验之一

    2016-05-25 18:03

  • Ajax学习笔记---3种Ajax的实现方法【推荐】,ajax---3

    Ajax学习笔记---3种Ajax的实现方法【推荐】,ajax---3

    2016-05-14 10:02

网友点评
$