流入攻击社会保险

 

掣肘 JavaScript 注入攻击

本课程的目标是分解什么在 ASP.NET MVC 应用程序中梗阻 JavaScript
注入攻击。本课程研商幸免网站受到 JavaScript
注入攻击的两种方法。大家将学习怎么通过编码突显的多少幸免 JavaScript
注入攻击。大家还将学习怎么着通过编码接受的内容幸免 JavaScript 注入攻击。

哪些是 JavaScript 注入攻击?

每当接受用户输入的情节一碗水端平新显示那么些情节时,网站就很简单遭受 JavaScript
注入攻击。让我们切磋一个便于受到 JavaScript 注入攻击的具体应用程序。

如果已经创办了一个客户反映网站,如图 1
所示。客户可以访问网站并输入对成品的上报新闻。当客户提交报告时,反馈音信重新突显在申报页面上。

社会保险 1.png) 


1
:客户反映网站(单击查看大图

客户反馈网站选择程序清单 1 中的 controller。此 controller
包罗五个称呼为 Index()Create() 的操作。

程序清单 1 HomeController.vb**

Public Class HomeController     Inherits System.Web.Mvc.Controller      Private db As New FeedbackDataContext()      Function Index()          Return View(db.Feedbacks)     End Function      Function Create(ByVal message As String)          ' Add feedback          Dim newFeedback As New Feedback()          newFeedback.Message = Server.HtmlEncode(message)          newFeedback.EntryDate = DateTime.Now          db.Feedbacks.InsertOnSubmit(newFeedback)          db.SubmitChanges()           ' Redirect          Return RedirectToAction("Index")     End Function End Class

Index() 方法展现 Index 视图。此办法将原先所有的客户反映传递到
Index 视图,方法是运用 LINQ to SQL 查询从数据库检索反馈。

社会保险,Create() 方法创造新的 Feedback
项并将其添加到数据库。客户输入到表单中的音讯将传递到音信参数中的
Create() 方法。创立了一个 Feedback 项,新闻被分配给 Feedback 项的
Message 属性。通过调用 DataContext.SubmitChanges() 方法,将
Feedback 项提交到数据库。最终,将访问者重定向到 Index
视图,该视图突显所有的反映。

程序清单 2 中包括了 Index 视图。

程序清单 2 Index.aspx**

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="CustomerFeedback.Index"%> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">     <h1>Customer Feedback</h1>     <p>          Please use the following form to enter feedback about our product.     </p>     <form method="post" action="/Home/Create">          <label for="message">Message:</label>          <br />          <textarea name="message" cols="50" rows="2"></textarea>          <br /><br />          <input type="submit" value="Submit Feedback" />     </form>      <% For Each feedback As CustomerFeedback.Feedback In ViewData.Model%>          <p>          <%=feedback.EntryDate.ToShortTimeString()%>          --          <%=feedback.Message%>          </p>     <% Next %> </asp:Content>

Index 视图有两部分。顶部涵盖实际的客户反映表单。尾部包含一个
For..Each 循环,该循环在具备在此以前的客户反馈中循环并出示每个反馈项的
EntryDate 和 Message 属性。

客户反馈网站是一个简约的网站。不幸的是,此网站不难受到 JavaScript
注入攻击。

假定正在将以下文本输入到客户反馈表单中:

<script>alert(“Boo!”)</script>

此文件表示显示警告音讯框的 JavaScript
脚本。在某人将此脚本提交到客户反馈表单后,音信 Boo!
会在今天任何人访问客户反映网站时突显,如图 2 所示。

社会保险 2.png) 

图 2:JavaScript
注入(单击查看大图

现行,您对 JavaScript 注入攻击的第一感应可能是不理会。您可能认为
JavaScript 注入攻击不过是一种 无伤大雅
的口诛笔伐。您或许还觉得别人不会透过 JavaScript 注入攻击搞破坏。

不佳的是,黑客会通过在网站中注入 JavaScript 举行破坏活动。使用
JavaScript 注入攻击可以进行跨站脚本 (XSS)
攻击。在跨站脚本攻击中,可以窃取保密的用户音信并将新闻发送到另一个网站。

譬如说,黑客可以行使 JavaScript 注入攻击窃取来自别的用户浏览器的 Cookies
值。假使将灵活新闻(如密码、信用卡帐号或社会有限支撑号码)保存在浏览器
Cookies 中,那么黑客可以使用 JavaScript
注入攻击窃取这一个音讯。或者,假使用户将灵活音信输入到页面的表单字段中,而页面受到
JavaScript 攻击的残害,那么黑客可以运用注入的 JavaScript
获取表单数据并将其发送到另一个网站。

请中度器重。认真对待 JavaScript
注入攻击并维护用户的保密音讯。在接下去的两部分中,大家将切磋幸免 ASP.NET
MVC 应用程序受到 JavaScript 注入攻击的二种技术。

方法 1:视图中的 HTML 编码

阻拦 JavaScript 注入攻击的一种不难方法是重复在视图中体现数据时,用 HTML
编码任何网站用户输入的数额。程序清单 3 中立异的 Index
视图就拔取了那种措施。

程序清单 3 Index.aspx(HTML 编码后)

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="CustomerFeedback.Index"%> <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">     <h1>Customer Feedback</h1>     <p>          Please use the following form to enter feedback about our product.     </p>      <form method="post" action="/Home/Create">          <label for="message">Message:</label>          <br />          <textarea name="message" cols="50" rows="2"></textarea>          <br /><br />          <input type="submit" value="Submit Feedback" />     </form>      <% For Each feedback As CustomerFeedback.Feedback In ViewData.Model%>          <p>          <%=feedback.EntryDate.ToShortTimeString()%>          --          <%=Html.Encode(feedback.Message)%>          </p>     <% Next %> </asp:Content>

请注意,feedback.Message 的值在展现前使用以下代码进行 HTML 编码:

<%=Html.Encode(feedback.Message)%>

选用 HTML 编码一个字符串的含意是怎么着啊?使用 HTML
编码字符串时,危险字符如 <> 被轮换为 HTML 实体,如
<>。所以,当使用 HTML 编码字符串
<script>alert(“Boo!”)</script> 时,它将更换为
<script>alert(“Boo!”)</script>。浏览器在解析编码的字符串时不再进行JavaScript 脚本。而是体现无害的页面,如图 3 所示。

社会保险 3.png) 

图 3:失败的 JavaScript
攻击(单击查看大图

请小心,程序清单 3 中的 Index 视图只是 feedback.Message
被编码后的值。feedback.EntryDate
的值没有被编码。只需编码用户输入的多少。因为 EntryDate
的值是控制器生成的,所以不需要使用 HTML 编码此值。

主意 2:控制器中的 HTML 编码

除外在视图中突显数据时使用 HTML
编码数据,还足以在将数据交到到数据库以前运用 HTML
编码数据。第二种方法正是程序清单 4 中 controller 的情况。

程序清单 4 HomeController.vb(HTML 编码后)

Public Class HomeController     Inherits System.Web.Mvc.Controller      Private db As New FeedbackDataContext()      Function Index()          Return View(db.Feedbacks)     End Function      Function Create(ByVal message As String)          ' Add feedback          Dim newFeedback As New Feedback()          newFeedback.Message = Server.HtmlEncode(message)          newFeedback.EntryDate = DateTime.Now          db.Feedbacks.InsertOnSubmit(newFeedback)          db.SubmitChanges()           ' Redirect          Return RedirectToAction("Index")     End Function End Class

请留意,Message 的值在提交到数据库从前是在 Create() 操作中经过 HTML
编码的。当在视图中再一次突显 Message 时,Message 被 HTML
编码,由此不会履行此外注入到 Message 中的 JavaScript。

普通,人们喜欢使用本课程中琢磨的率先种艺术,而不希罕使用第三种方式。第三种形式的题材在于在数据库中最终会保留
HTML 编码的数码。换言之,数据库中的数据会含有奇怪的字符。

那有哪些坏处呢?即使急需用除网页以外的款型显得数据库数据,则将赶上难点。例如,不可以随目的在于Windows Forms 应用程序中浮现数据。

总结

本课程的目标是引起读者对 JavaScript 注入攻击的推崇。教程钻探了防范ASP.NET MVC 应用程序遭逢 JavaScript 注入攻击的二种艺术。能够利用 HTML
编码用户提交到视图中的数据,也可以选拔 HTML
编码用户提交到控制器中的数据。

 

http://msdn.microsoft.com/zh-cn/dd320322.aspx

发表评论

电子邮件地址不会被公开。 必填项已用*标注