阻碍 JavaScript 注入攻击

 

拦 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

发表评论

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