AJax技术

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

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

注:上面是例子是非常简单的,攻击代码使用了querystring作为参数。但是这不表示form参数(POST提交的参数值)就会更加安全,攻击者同样可以设置一个包含表单页面作为POST请求发送到你的站点并且诱导用户访问他们的

注:上面是例子是非常简单的,攻击代码使用了querystring作为参数。但是这不表示form参数(POST提交的参数值)就会更加安全,攻击者同样可以设置一个包含表单页面作为POST请求发送到你的站点并且诱导用户访问他们的页面。

之所以会有这个问题出现,是因为浏览器会信任在我们发送的页面里面注入的脚本,认为它们是合法的。并允许这些脚本访问cookies,cached对象以及跟程序相关的HTML。攻击者能够很容易的窃取这个数据,并用它访问我们的网站,或者巧妙地重定向用户到一个伪造的站点骗取用户的关键信息(密码,各种卡)

Razor HTML编码(Razor HTML Encoding)

幸运的是,前面提到的攻击不会默认运行。Razor视图引擎帮助我们对任何引用了"@"标签的数据进行了编码,让它们作为HTML安全的呈现出来。也就是说,当我们发起上面的URL请求时,Razor会处理returnUrl的值并且替换掉特殊的字符,呈现的javascript脚本也是无效的。如下:
<a href="&quot; onmousemove=&quot;alert(&#39;XSS!&#39;)&quot; style=&quot;position:
absolute;left:0;top:0;width:100%;height:100%;">Continue shopping</a>
我们也可以绕过自动的HTML编码,尽管很少有理由来这么做。Razor引擎处理的是MvcHtmlString对象的内容(被编码过的),如果不想被编码可以这样:
<a href="@Html.Raw( Model.ReturnUrl) ">Continue shopping</a>
使用这样方式时候需要我们非常谨慎,而且不应该对任何用户提交的数据都使用。

Tip:有时需要允许用户提供或编辑HTML标签来让其他的用户看到,例如在CMS系统里面,我们不得发布用户提供的数据,为了保持用户数据的原始性不能对数据进行编码,这已经造成了内住的危险性。能够缓和这个危险发生的方式就是严格地过滤:使用HTML Agility Pack这样的HTML解析器来确保用户提交的HTML只包含程序允许的标签,CSS等等。HMTL过滤很容易出错,因为恶意脚本能够嵌入在看似没有危害的地方(如CSS或<img>标签的src属性里面),要了解更多关于脚本隐藏的内容可以看这里。

请求验证(Request Validation)

抵御攻击的第二道防线就是ASP.NET平台提供的请求验证功能,目的就是为了阻止潜在的危险数据到达应用程序。如果用户试图提交类似HTML的数据,ASP.NET会抛出一个异常。这是发生在请求传递到MVC框架之前,所以程序不会接收到这些数据。请求验证听上去好像比实际的更加有用,它的确能够阻止攻击,但也产生了许多错误的报警,这样可能会让用户感到困惑。这是因为请求验证会拒绝任何类似HTML标签的数据,并且包含了经过验证的数据。例如,请求验证功能会拒绝一个完全经过验证的字符串,
如"I'm writing C# code with generics, e.g., List<string>"并且因为这里的请求始终没有到达MVC应用程序,所以,我们也不能提供相应的指示来帮助用户避免错误。

注:我们会发现请求验证的最大的问题就是会造成很多错误的安全感知信息,开发者依靠请求验证,但是由于产生的错误信息会让用户感到困惑,所以经常在实际的生产中会禁用这个功能。

禁用请求验证(Disabling Request Validation)

有三种方式来禁用,第一种方式:在Model里面对属性使用AllowHtml特性,如下:

using System.ComponentModel.DataAnnotations; using System.Web.Mvc; namespace SecurityAndVulnerability.Models { public class Appointment { [AllowHtml] public string ClientName { get; set; } [DataType(DataType.Date)] public DateTime Date { get; set; } public bool TermsAccepted { get; set; } } }

上面展示了应用到属性上的特性AllowHtml,这里的对ClientName禁用了请求验证,因此对所有的action和controller都会生效。第二种方式:对controller使用ValidateInput特性,如下:

[ValidateInput(false)] public class AppointmentController : Controller { public ViewResult MakeBooking() { return View(new Appointment { Date = DateTime.Now }); } .....

上面对整个controller禁用了请求验证功能,当然还可以只对单个的action应用。

javascript字符串编码与XSS(JavaScript String Encoding and XSS)

有时,我们可能想在javascript代码块中间呈现用户提交的数据。这样做可能有点复杂,因为javascript和HTML展示文本的方式是不同的。下面是在脚本中包含了用户数据的:

View Code

System.Web.Mvc; namespace SecurityAndVulnerability.Controllers { public class HomeController : Controller { public ActionResult Index() { return View((object)string.Empty); } [HttpPost] [ValidateInput(false)] public ActionResult Index(string term) { , (object)term); } } } //添加两个视图Index和Search //Index @model string @{ ViewBag.Title = ; } <h4>Search</h4> @using (Html.BeginForm()) { @:Enter search term: @Html.TextBox() <input type=value=/> } //Search @model string @{ ViewBag.Title = ; } <h4>Results</h4> <ul id=></ul> <script type=> $(function () { $.getJSON(, { q: searchTerm, v: }, function (searchResults) { $().children().remove(); $.each(searchResults.responseData.results, function () { $().append($().html(this.title)); }); } ); }); </script>

 

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

网友点评
-