SlideShare a Scribd company logo
MVC :: Preventing JavaScript Injection
Attacks
The goal of this tutorial is to explain how you can prevent JavaScript injection attacks in
your ASP.NET MVC applications. This tutorial discusses two approaches to defending your
website against a JavaScript injection attack. You learn how to prevent JavaScript injection
attacks by encoding the data that you display. You also learn how to prevent JavaScript
injection attacks by encoding the data that you accept.

What is a JavaScript Injection Attack?
Whenever you accept user input and redisplay the user input, you open your website to
JavaScript injection attacks. Let’s examine a concrete application that is open to JavaScript
injection attacks.
Imagine that you have created a customer feedback website (see Figure 1). Customers can
visit the website and enter feedback on their experience using your products. When a
customer submits their feedback, the feedback is redisplayed on the feedback page.
Figure 1 – Customer Feedback Website


The customer feedback website uses the controller in Listing 1. This controller contains
two actions named Index() and Create().

Listing 1 – HomeController.cs
   using System;
   using System.Web.Mvc;
   using CustomerFeedback.Models;


   namespace CustomerFeedback.Controllers
{
        [HandleError]
        public class HomeController : Controller
        {
             private FeedbackDataContext db = new FeedbackDataContext();


             public ActionResult Index()
             {
                  return View(db.Feedbacks);
             }


             public ActionResult Create(string message)
             {
                  // Add feedback
                  var newFeedback = new Feedback();
                  newFeedback.Message = message;
                  newFeedback.EntryDate = DateTime.Now;
                  db.Feedbacks.InsertOnSubmit(newFeedback);
                  db.SubmitChanges();


                  // Redirect
                  return RedirectToAction("Index");
             }
        }
   }


The Index() method displays the Index view. This method passes all of the previous
customer feedback to the Index view by retrieving the feedback from the database (using a
LINQ to SQL query).
The Create() method creates a new Feedback item and adds it to the database. The
message that the customer enters in the form is passed to the Create() method in the
message parameter. A Feedback item is created and the message is assigned to the
Feedback item’s Message property. The Feedback item is submitted to the database with the
DataContext.SubmitChanges() method call. Finally, the visitor is redirected back to the
Index view where all of the feedback is displayed.

The Index view is contained in Listing 2.
Listing 2 – Index.aspx
   <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
      AutoEventWireup="true" CodeBehind="Index.aspx.cs"
      Inherits="CustomerFeedback.Views.Home.Index" %>
   <%@ Import Namespace="CustomerFeedback.Models" %>
   <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>


        <% foreach (Feedback feedback in ViewData.Model)
           {%>
              <p>
              <%=feedback.EntryDate.ToShortTimeString()%>
              --
              <%=feedback.Message%>
              </p>
        <% }%>


   </asp:Content>

The Index view has two sections. The top section contains the actual customer feedback
form. The bottom section contains a For..Each loop that loops through all of the previous
customer feedback items and displays the EntryDate and Message properties for each
feedback item.
The customer feedback website is a simple website. Unfortunately, the website is open to
JavaScript injection attacks.
Imagine that you enter the following text into the customer feedback form:
       <script>alert(“Boo!”)</script>

This text represents a JavaScript script that displays an alert message box. After someone
submits this script into the feedback form, the message Boo! will appear whenever anyone
visits the customer feedback website in the future (see Figure 2).




Figure 2 – JavaScript Injection
Now, your initial response to JavaScript injection attacks might be apathy. You might think
that JavaScript injection attacks are simply a type of defacement attack. You might believe
that no one can do anything truly evil by committing a JavaScript injection attack.
Unfortunately, a hacker can do some really, really evil things by injecting JavaScript into a
website. You can use a JavaScript injection attack to perform a Cross-Site Scripting (XSS)
attack. In a Cross-Site Scripting attack, you steal confidential user information and send the
information to another website.
For example, a hacker can use a JavaScript injection attack to steal the values of browser
cookies from other users. If sensitive information -- such as passwords, credit card
numbers, or social security numbers – is stored in the browser cookies, then a hacker can
use a JavaScript injection attack to steal this information. Or, if a user enters sensitive
information in a form field contained in a page that has been compromised with a JavaScript
attack, then the hacker can use the injected JavaScript to grab the form data and send it to
another website.
Please be scared. Take JavaScript injection attacks seriously and protect your user’s
confidential information. In the next two sections, we discuss two techniques that you can
use to defend your MVC applications from JavaScript injection attacks.

Approach #1: HTML Encode in the View
One easy method of preventing JavaScript injection attacks is to HTML encode any data
entered by website users when you redisplay the data in a view. The updated Index view in
Listing 3 follows this approach.
Listing 3 – Index.aspx (HTML Encoded)
   <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
      AutoEventWireup="true" CodeBehind="Index.aspx.cs"
      Inherits="CustomerFeedback.Views.Home.Index" %>
   <%@ Import Namespace="CustomerFeedback.Models" %>
   <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>


        <% foreach (Feedback feedback in ViewData.Model)
           {%>
            <p>
            <%=feedback.EntryDate.ToShortTimeString()%>
            --
            <%=Html.Encode(feedback.Message)%>
            </p>
        <% }%>


   </asp:Content>


Notice that the value of feedback.Message is HTML encoded before the value is displayed
with the following code:
            <%=Html.Encode(feedback.Message)%>

What does it mean to HTML encode a string? When you HTML encode a string, dangerous
characters such as < and > are replaced by HTML entity references such as &lt; and &gt;.
So when the string <script>alert("Boo!")</script> is HTML encoded, it gets converted
to &lt;script&gt;alert(&quot;Boo!&quot;)&lt;/script&gt;. The encoded string no
longer executes as a JavaScript script when interpreted by a browser. Instead, you get the
harmless page in Figure 3.
Figure 3 – Defeated JavaScript Attack


Notice that in the Index view in Listing 3 only the value of feedback.Message is encoded.
The value of feedback.EntryDate is not encoded. You only need to encode data entered by
a user. Because the value of EntryDate was generated in the controller, you don’t need to
HTML encode this value.

Approach #2: HTML Encode in the Controller
Instead of HTML encoding data when you display the data in a view, you can HTML encode
the data just before you submit the data to the database. This second approach is taken in
the case of the controller in Listing 4.

Listing 4 – HomeController.cs (HTML Encoded)
   using System;
   using System.Web.Mvc;
   using CustomerFeedback.Models;


   namespace CustomerFeedback.Controllers
   {
[HandleError]
        public class HomeController : Controller
        {
             private FeedbackDataContext db = new FeedbackDataContext();


             public ActionResult Index()
             {
                  return View(db.Feedbacks);
             }


             public ActionResult Create(string message)
             {
                  // Add feedback
                  var newFeedback = new Feedback();
                  newFeedback.Message = Server.HtmlEncode(message);
                  newFeedback.EntryDate = DateTime.Now;
                  db.Feedbacks.InsertOnSubmit(newFeedback);
                  db.SubmitChanges();


                  // Redirect
                  return RedirectToAction("Index");
             }
        }
   }



Notice that the value of Message is HTML encoded before the value is submitted to the
database within the Create() action. When the Message is redisplayed in the view, the
Message is HTML encoded and any JavaScript injected in the Message is not executed.
Typically, you should favor the first approach discussed in this tutorial over this second
approach. The problem with this second approach is that you end up with HTML encoded
data in your database. In other words, your database data is dirtied with funny looking
characters.
Why is this bad? If you ever need to display the database data in something other than a
web page, then you will have problems. For example, you can no longer easily display the
data in a Windows Forms application.
Summary
The purpose of this tutorial was to scare you about the prospect of a JavaScript injection
attack. This tutorial discussed two approaches for defending your ASP.NET MVC applications
against JavaScript injection attacks: you can either HTML encode user submitted data in the
view or you can HTML encode user submitted data in the controller.

More Related Content

PDF
Mvc acchitecture
PDF
ajax_pdf
PPT
PDF
Java Svet - Communication Between Android App Components
PPT
Entity Manager
PPT
PPTX
Asp.NET MVC
DOCX
LearningMVCWithLINQToSQL
Mvc acchitecture
ajax_pdf
Java Svet - Communication Between Android App Components
Entity Manager
Asp.NET MVC
LearningMVCWithLINQToSQL

What's hot (16)

PPTX
WP7 HUB_Consuming Data Services
PPTX
Mockito junit
PDF
Building richwebapplicationsusingasp
PPTX
Asp.net mvc training
PDF
ChircuVictor StefircaMadalin rad_aspmvc3_wcf_vs2010
PDF
AI: Mobile Apps That Understands Your Intention When You Typed
PDF
Micro services from scratch - Part 1
PPT
Silverlight 2 for Developers - TechEd New Zealand 2008
PPTX
16 interacting with user data contacts and appointments
PDF
Android Cloud to Device Messaging Framework at GTUG Stockholm
PDF
MongoDB Stitch Tutorial
PPTX
MongoDB.local Atlanta: Introduction to Serverless MongoDB
DOCX
ASP.NET MVC3 RAD
DOCX
Server side programming bt0083
DOCX
Leture5 exercise onactivities
DOCX
Repository Pattern in MVC3 Application with Entity Framework
WP7 HUB_Consuming Data Services
Mockito junit
Building richwebapplicationsusingasp
Asp.net mvc training
ChircuVictor StefircaMadalin rad_aspmvc3_wcf_vs2010
AI: Mobile Apps That Understands Your Intention When You Typed
Micro services from scratch - Part 1
Silverlight 2 for Developers - TechEd New Zealand 2008
16 interacting with user data contacts and appointments
Android Cloud to Device Messaging Framework at GTUG Stockholm
MongoDB Stitch Tutorial
MongoDB.local Atlanta: Introduction to Serverless MongoDB
ASP.NET MVC3 RAD
Server side programming bt0083
Leture5 exercise onactivities
Repository Pattern in MVC3 Application with Entity Framework
Ad

Viewers also liked (8)

PDF
Demo-BW_Tutorial-USPG_%20Ed_1-3
PDF
&lt;img src="../i/r_14.png" />
PDF
introduction
PDF
BloggingWithStyle_2008
PDF
tutorial7
PDF
XSD%20and%20jCAM%20tutorial
PDF
TopStyle Help &amp; &lt;b>Tutorial&lt;/b>
PDF
Demo-BW_Tutorial-USPG_%20Ed_1-3
&lt;img src="../i/r_14.png" />
introduction
BloggingWithStyle_2008
tutorial7
XSD%20and%20jCAM%20tutorial
TopStyle Help &amp; &lt;b>Tutorial&lt;/b>
Ad

Similar to ASPNET_MVC_Tutorial_06_CS (20)

DOCX
Adding a view
PDF
Aspnet mvc tutorial_01_cs
PDF
MVC Design Pattern in JavaScript by ADMEC Multimedia Institute
PPT
MVC ppt presentation
PPTX
Asp.Net MVC Intro
PDF
Mvc interview questions – deep dive jinal desai
PDF
Secure mvc application saineshwar
PDF
ajax_pdf
PPTX
UIF(UI Frame work)Notes MRUH_UNIT 2.pptx
PPTX
How to add Many2Many fields in odoo website form.pptx
PDF
Learn about dot net attributes
PPTX
Ways to Set Focus on an Input Field After Rendering in React.pptx
PDF
Aspnet mvc tutorial_9_cs
PPTX
React JS .NET
PDF
Server side rendering with React and Symfony
PDF
React js
DOCX
JavaScript
PDF
Java Web Programming [8/9] : JSF and AJAX
PPTX
8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated
PDF
Angular - Chapter 4 - Data and Event Handling
Adding a view
Aspnet mvc tutorial_01_cs
MVC Design Pattern in JavaScript by ADMEC Multimedia Institute
MVC ppt presentation
Asp.Net MVC Intro
Mvc interview questions – deep dive jinal desai
Secure mvc application saineshwar
ajax_pdf
UIF(UI Frame work)Notes MRUH_UNIT 2.pptx
How to add Many2Many fields in odoo website form.pptx
Learn about dot net attributes
Ways to Set Focus on an Input Field After Rendering in React.pptx
Aspnet mvc tutorial_9_cs
React JS .NET
Server side rendering with React and Symfony
React js
JavaScript
Java Web Programming [8/9] : JSF and AJAX
8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated
Angular - Chapter 4 - Data and Event Handling

More from tutorialsruby (20)

PDF
&lt;img src="../i/r_14.png" />
PDF
The Art Institute of Atlanta IMD 210 Fundamentals of Scripting &lt;b>...&lt;/b>
PDF
&lt;img src="../i/r_14.png" />
PDF
&lt;img src="../i/r_14.png" />
PDF
Standardization and Knowledge Transfer – INS0
PDF
xhtml_basics
PDF
xhtml_basics
PDF
xhtml-documentation
PDF
xhtml-documentation
PDF
0047ecaa6ea3e9ac0a13a2fe96f4de3bfd515c88f5d90c1fae79b956363d7f02c7fa060269
PDF
0047ecaa6ea3e9ac0a13a2fe96f4de3bfd515c88f5d90c1fae79b956363d7f02c7fa060269
PDF
HowTo_CSS
PDF
HowTo_CSS
PDF
BloggingWithStyle_2008
PDF
cascadingstylesheets
PDF
cascadingstylesheets
PDF
Winter%200405%20-%20Advanced%20Javascript
PDF
Winter%200405%20-%20Advanced%20Javascript
&lt;img src="../i/r_14.png" />
The Art Institute of Atlanta IMD 210 Fundamentals of Scripting &lt;b>...&lt;/b>
&lt;img src="../i/r_14.png" />
&lt;img src="../i/r_14.png" />
Standardization and Knowledge Transfer – INS0
xhtml_basics
xhtml_basics
xhtml-documentation
xhtml-documentation
0047ecaa6ea3e9ac0a13a2fe96f4de3bfd515c88f5d90c1fae79b956363d7f02c7fa060269
0047ecaa6ea3e9ac0a13a2fe96f4de3bfd515c88f5d90c1fae79b956363d7f02c7fa060269
HowTo_CSS
HowTo_CSS
BloggingWithStyle_2008
cascadingstylesheets
cascadingstylesheets
Winter%200405%20-%20Advanced%20Javascript
Winter%200405%20-%20Advanced%20Javascript

Recently uploaded (20)

PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Big Data Technologies - Introduction.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Cloud computing and distributed systems.
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Approach and Philosophy of On baking technology
PDF
Encapsulation theory and applications.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Spectroscopy.pptx food analysis technology
Spectral efficient network and resource selection model in 5G networks
Big Data Technologies - Introduction.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf
A comparative analysis of optical character recognition models for extracting...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Network Security Unit 5.pdf for BCA BBA.
Agricultural_Statistics_at_a_Glance_2022_0.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Building Integrated photovoltaic BIPV_UPV.pdf
Cloud computing and distributed systems.
Diabetes mellitus diagnosis method based random forest with bat algorithm
Approach and Philosophy of On baking technology
Encapsulation theory and applications.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Review of recent advances in non-invasive hemoglobin estimation
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
NewMind AI Weekly Chronicles - August'25-Week II
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Spectroscopy.pptx food analysis technology

ASPNET_MVC_Tutorial_06_CS

  • 1. MVC :: Preventing JavaScript Injection Attacks The goal of this tutorial is to explain how you can prevent JavaScript injection attacks in your ASP.NET MVC applications. This tutorial discusses two approaches to defending your website against a JavaScript injection attack. You learn how to prevent JavaScript injection attacks by encoding the data that you display. You also learn how to prevent JavaScript injection attacks by encoding the data that you accept. What is a JavaScript Injection Attack? Whenever you accept user input and redisplay the user input, you open your website to JavaScript injection attacks. Let’s examine a concrete application that is open to JavaScript injection attacks. Imagine that you have created a customer feedback website (see Figure 1). Customers can visit the website and enter feedback on their experience using your products. When a customer submits their feedback, the feedback is redisplayed on the feedback page.
  • 2. Figure 1 – Customer Feedback Website The customer feedback website uses the controller in Listing 1. This controller contains two actions named Index() and Create(). Listing 1 – HomeController.cs using System; using System.Web.Mvc; using CustomerFeedback.Models; namespace CustomerFeedback.Controllers
  • 3. { [HandleError] public class HomeController : Controller { private FeedbackDataContext db = new FeedbackDataContext(); public ActionResult Index() { return View(db.Feedbacks); } public ActionResult Create(string message) { // Add feedback var newFeedback = new Feedback(); newFeedback.Message = message; newFeedback.EntryDate = DateTime.Now; db.Feedbacks.InsertOnSubmit(newFeedback); db.SubmitChanges(); // Redirect return RedirectToAction("Index"); } } } The Index() method displays the Index view. This method passes all of the previous customer feedback to the Index view by retrieving the feedback from the database (using a LINQ to SQL query). The Create() method creates a new Feedback item and adds it to the database. The message that the customer enters in the form is passed to the Create() method in the message parameter. A Feedback item is created and the message is assigned to the Feedback item’s Message property. The Feedback item is submitted to the database with the DataContext.SubmitChanges() method call. Finally, the visitor is redirected back to the Index view where all of the feedback is displayed. The Index view is contained in Listing 2.
  • 4. Listing 2 – Index.aspx <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="CustomerFeedback.Views.Home.Index" %> <%@ Import Namespace="CustomerFeedback.Models" %> <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> <% foreach (Feedback feedback in ViewData.Model) {%> <p> <%=feedback.EntryDate.ToShortTimeString()%> -- <%=feedback.Message%> </p> <% }%> </asp:Content> The Index view has two sections. The top section contains the actual customer feedback form. The bottom section contains a For..Each loop that loops through all of the previous customer feedback items and displays the EntryDate and Message properties for each feedback item.
  • 5. The customer feedback website is a simple website. Unfortunately, the website is open to JavaScript injection attacks. Imagine that you enter the following text into the customer feedback form: <script>alert(“Boo!”)</script> This text represents a JavaScript script that displays an alert message box. After someone submits this script into the feedback form, the message Boo! will appear whenever anyone visits the customer feedback website in the future (see Figure 2). Figure 2 – JavaScript Injection
  • 6. Now, your initial response to JavaScript injection attacks might be apathy. You might think that JavaScript injection attacks are simply a type of defacement attack. You might believe that no one can do anything truly evil by committing a JavaScript injection attack. Unfortunately, a hacker can do some really, really evil things by injecting JavaScript into a website. You can use a JavaScript injection attack to perform a Cross-Site Scripting (XSS) attack. In a Cross-Site Scripting attack, you steal confidential user information and send the information to another website. For example, a hacker can use a JavaScript injection attack to steal the values of browser cookies from other users. If sensitive information -- such as passwords, credit card numbers, or social security numbers – is stored in the browser cookies, then a hacker can use a JavaScript injection attack to steal this information. Or, if a user enters sensitive information in a form field contained in a page that has been compromised with a JavaScript attack, then the hacker can use the injected JavaScript to grab the form data and send it to another website. Please be scared. Take JavaScript injection attacks seriously and protect your user’s confidential information. In the next two sections, we discuss two techniques that you can use to defend your MVC applications from JavaScript injection attacks. Approach #1: HTML Encode in the View One easy method of preventing JavaScript injection attacks is to HTML encode any data entered by website users when you redisplay the data in a view. The updated Index view in Listing 3 follows this approach. Listing 3 – Index.aspx (HTML Encoded) <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="CustomerFeedback.Views.Home.Index" %> <%@ Import Namespace="CustomerFeedback.Models" %> <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" />
  • 7. </form> <% foreach (Feedback feedback in ViewData.Model) {%> <p> <%=feedback.EntryDate.ToShortTimeString()%> -- <%=Html.Encode(feedback.Message)%> </p> <% }%> </asp:Content> Notice that the value of feedback.Message is HTML encoded before the value is displayed with the following code: <%=Html.Encode(feedback.Message)%> What does it mean to HTML encode a string? When you HTML encode a string, dangerous characters such as < and > are replaced by HTML entity references such as &lt; and &gt;. So when the string <script>alert("Boo!")</script> is HTML encoded, it gets converted to &lt;script&gt;alert(&quot;Boo!&quot;)&lt;/script&gt;. The encoded string no longer executes as a JavaScript script when interpreted by a browser. Instead, you get the harmless page in Figure 3.
  • 8. Figure 3 – Defeated JavaScript Attack Notice that in the Index view in Listing 3 only the value of feedback.Message is encoded. The value of feedback.EntryDate is not encoded. You only need to encode data entered by a user. Because the value of EntryDate was generated in the controller, you don’t need to HTML encode this value. Approach #2: HTML Encode in the Controller Instead of HTML encoding data when you display the data in a view, you can HTML encode the data just before you submit the data to the database. This second approach is taken in the case of the controller in Listing 4. Listing 4 – HomeController.cs (HTML Encoded) using System; using System.Web.Mvc; using CustomerFeedback.Models; namespace CustomerFeedback.Controllers {
  • 9. [HandleError] public class HomeController : Controller { private FeedbackDataContext db = new FeedbackDataContext(); public ActionResult Index() { return View(db.Feedbacks); } public ActionResult Create(string message) { // Add feedback var newFeedback = new Feedback(); newFeedback.Message = Server.HtmlEncode(message); newFeedback.EntryDate = DateTime.Now; db.Feedbacks.InsertOnSubmit(newFeedback); db.SubmitChanges(); // Redirect return RedirectToAction("Index"); } } } Notice that the value of Message is HTML encoded before the value is submitted to the database within the Create() action. When the Message is redisplayed in the view, the Message is HTML encoded and any JavaScript injected in the Message is not executed. Typically, you should favor the first approach discussed in this tutorial over this second approach. The problem with this second approach is that you end up with HTML encoded data in your database. In other words, your database data is dirtied with funny looking characters. Why is this bad? If you ever need to display the database data in something other than a web page, then you will have problems. For example, you can no longer easily display the data in a Windows Forms application.
  • 10. Summary The purpose of this tutorial was to scare you about the prospect of a JavaScript injection attack. This tutorial discussed two approaches for defending your ASP.NET MVC applications against JavaScript injection attacks: you can either HTML encode user submitted data in the view or you can HTML encode user submitted data in the controller.