,Quanta Confidential,Quanta Manufacturing System,Quanta Confidential,Quanta Mfg Technology Center,技術深耕、品質深植,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2020/3/29,#,MVC,程序的安全性,Prepared by:,Giant,Date:,Nov,24,2014,2024/11/19,1,MVC,的权限控制,1.Authorize,特性登录,登陆失败则重定向到,web.config,文件中定义的登录界面,代码如下:,(,1,)应用于单个控制器:,(,2,)应用于整个控制器:,2,3,P-,3,2.,使用全局授权过滤器,全局授权仅对,MVC,是全局的,它不保障,Web Forms,、静态内容、或其他,ASP.NET,处理程序的安全。,FilterConfig,.RegisterGlobalFilters(,GlobalFilters,.Filters);,global.asax,文件,:,GlobalFilters,是全局过滤器的集合,可以通过,add,方法添加过滤器,4,P-,4,3.,要求角色成员使用,Authorize,特性,Authorize,(Roles=,Administrator,),(,1,)允许指定用户和角色:,(,2,)指定角色列表,用逗号分隔:,Authorize,(Roles=,“Administrator,SuperAdmin”,),(,3,)授权一组用户:,Authorize,(Users=,“Jerry,Ava,Newton,Linaly”,),(,4,)同时授权用户和角色:,Authorize,(Users=,“Giant”,Roles=,Administrator,),使用角色管理权限的优点:,可以添加和删除用户,一个用户的访问权限会随着时间的变化而不断变化。,管理角色成员比管理用户成员简单。,基于角色的管理可以在不同的部署环境中拥有不同的访问列表。例如在开发环境给予,开发人员访问工资的权限,在生产环境中要取消该权限。,5,P-,5,OAuth,和,OpenID,(1).,当,可信任方注册推特认证权限时,它们可以请求只读连接(这种连接给它们提供用户流的读权限)、读写连接(这种连接给它们提供用户流的读写权限)以及具有直接消息发送功能的读写连接(给它们提供用户数据的最大访问权限)。因此当通过,OAuth,使用推特对用户进行认证时,它们要准确的告知它们需要提供什么类型的权限。,(2).OpenID,只是通过验证你的用户名和密码确定你是你声称的那个人。它没有方法来控制功能访问权限。,用更直白的话来说,,OpenID,是认证,而,OAuth,是认证和授权,(某些功能给提供服务方),6,P-,6,通过,OAuth,和,OpenID,的外部登录,1.,注册外部登录提供器:,AuthConfig,文件,:,OAuthWebSecurity,.RegisterGoogleClient,();,2.,配置,OpenID,提供器:,using DotNetOpenAuth.AspNet.Clients;,using DotNetOpenAuth.OpenId.RelyingParty;,var,MyOpenIdClient=,new,OpenIdClient,(,myopenid,WellKnownProviders,.MyOpenId);,OAuthWebSecurity,.RegisterClient(MyOpenIdClient,MyOpenID,null,);,在,Facebook,注册你的网站时,你可以规定,localhost,为网站域名,,http:/localhost/,为网址,像下面图片显示的那样。使用,localhost,对大多数提供方有效,但目前对,Microsoft,提供方无效。对,Microsoft,提供方,你必须包含一个合法的,web,网站地址。,3.,配置,OAuth,提供器:,OAuthWebSecurity,.RegisterFacebookClient(,appId:,“1234567”,/,在提供方注册你的网站时,收到的,key/ID,以及密码,appSecret:,asdfghjkl,);,7,P-,7,外部登录的安全性,可信的外部登录提供器;,要求,SSL,登录;,RequireHttps,8,P-,8,网站攻击与防御,1.,跨站脚本攻击(,XSS,),攻击方法:,被动注入:,通过用户将恶意的脚本命令输入到网站中,而网站又能接受这些“不干净”的输入。,输入的内容会先存入数据库,然后再重新在页面上显示。例如:博客,主动注入:,通过直接在页面上显示的用户输入,。输入,的内容直接在页面上显示。,alert(10),阻止,XSS,攻击:,对所有内容进行,HTML,编码:,Razor,引擎,默认对输出内容进行,HTML,编码:例如,Model.FirstName,。,非,Razor,引擎:,Html.Encode,或,Html.AttributeEncode,或,Url.Encode,点击链接,点击链接,JavaScript,编码:,使用,Ajax.JavaScriptStringEncode,辅助函数对在,JavaScript,中使用的字符串进行编码,。,varsearchItem=“Html.Raw(Ajax.JavaScriptStringEncode(Model)”;,3.,将,AntiXSS,库作为,ASP.NET,的默认编码器,Encoder.JavaScriptEncode,辅助,函数,AntiXSS,库下载地址:,http:/,9,P-,9,网站攻击与防御,2.,跨站请求伪造(,CSRF,),攻击方法,:,混淆代理:,代理就是用户的浏览器,它受到了愚弄以至于误用其权限,将用户呈现给远程的网站。,转账标示在,URL,中的严重安全漏洞,http:/?function=transfer&,amount,=1000&toaccountnumber=23234545&from=checking,阻止,CSRF,攻击:,令牌验证:,Html.AntiForgeryToken(),辅助,方法会输出一个加密值作为隐藏的输入元素:,该值将与作为会话,cookie,存储在用户浏览器,中的另一个值相匹配。在提交表单时,,ActionFilter,就会验证这两个值是否匹配:,ValidateAntiForgeryToken,public ActionResult Login(string email,string password,string returnUrl),幂等的,GET,请求:,XXX,。,3.HttpReferrer,验证,IsPostedFromThisSite,public ActionResult Login(string email,string password,string returnUrl),CSRF,是,一种对网站的恶意利用。尽管听起来像跨站脚本(,XSS,),但它与,XSS,非常不同,并且攻击方式几乎相左,。,XSS,利用站点内的信任用户,而,CSRF,则通过伪装来自受信任用户的请求来利用受信任的网站,。,10,P-,10,网站攻击与防御,3.Cookie,盗窃,Cookie,的存放形式:,会话,cookie,:,存储在浏览器的内存中,在浏览器的每次请求中通过,HTTP,头信息进行传递。,持久性,cookie,:,存储在计算机硬盘上的实际文本文件中,并与会话,cookie,以相同的方式传递。,使用,HttpOnly,阻止,cookie,盗窃:,也可,在程序中为编写的每个,cookie,单独设置:,Response.Cookie“MyCookie”.Value=“Remembering you”,;,Response.Cookie“MyCookie”.HttpOnly=true;,11,P-,11,网站攻击与防御,4.,重复提交,攻击方法:,ASP.NET,模型绑定,通过重复提交呈现了另一种攻击媒介。,如,左边的类中,用户可以提交对商品的评价,我们并不希望用户自己,可以审核通过自己的评论。但是存在大量的,web,开发工具可供恶意用,户向查询字符串或提交的表单数据中添加“,Approve=true,”,从而实,现干预表单提交。,或者黑客知道该类中有个,Product,属性,提交,Product.Price,等。,阻止重复提交攻击,:,使用,Bind,特性:,白名单,:,Bind(Include=“Name,Comment”),黑名单,:,Bind(Exclude=“ReviewID,ProductID,Product,Approved”),UpdateModel,与,TryUpdateModel,也有一个重载版本来接收一个绑定列表,:,UpdateModel,(com,new,string,Id,Name,Content,);,3.,使用,视图,模型,即另外在定义一个模型来专供视图使用,仅仅包括需要绑定的,属性,public class ReviewViewModel,public,string Name get;set;,public,string Comment get;set;,12,P-,12,网站攻击与防御,5.,开放重定向,就是常见的钓鱼网站(,phishing attack,),打开的链接地址被定向到了另一个,网址,,MVC3,以上版本已添加阻止开发重定向攻击功能:,http:/localhost:7877/Cart,http:/localhost:7877/Member/Login?,ReturnUrl,=%2fOrder%2fComplete,http:/localhost:7877/Member/Login?ReturnUrl=http:/,/,使用,IsLocalURL(),辅助方法对返回的,URL,进行验证:,13,P-,13,适当的错误报告和堆栈跟踪,customErrors,模式的,3,个设置选项:,O,n,:,最,安全选项,总是隐藏错误提示信息。,RemoteOnly,:,向大多数用户展示一般的错误信息,但向拥有服务器访问权限的用户展示完整的,错误提示信息。,3.Off,:,最容易受攻击选项,它向访问网站的每个用户展示详细的错误,提示信息,。,14,P-,14,ASP.Net Web Forms,为什么无需过多考虑安全性,15,P-,15,锦囊妙语,永远不要相信用户提供的任何数据,每当渲染作为用户输入而引入的数据时,请对其进行,HTML,编码,考虑网站哪些部分允许匿名访问,哪些要求认证访问,不要试图自己净化用户的,HTML,输入,在不需要通过客户端脚本访问,cookie,时,使用,HTTP-only cookie,请记住,外部输入不是显式的表单域,因为它包括,URL,查询字符串、隐藏表单域、,Ajax,请求,以及我们使用的外部,WEB,服务结果等。,7.,强烈建议使用,AntiXSS,库。,http:/ MVC 4,使用,OAuth,http:/ End,!,P-,16,