Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Stephen Walther
Verhindern Sie JavaScript-Einschleusungsangriffe und Cross-Site Scripting-Angriffe auf Sie. In diesem Tutorial erläutert Stephen Walther, wie Sie diese Arten von Angriffen durch HTML-Codierung Ihrer Inhalte leicht besiegen können.
In diesem Tutorial wird erläutert, wie Sie JavaScript-Einschleusungsangriffe in Ihren ASP.NET MVC-Anwendungen verhindern können. In diesem Tutorial werden zwei Ansätze zum Schutz Ihrer Website gegen einen JavaScript-Einschleusungsangriff erläutert. Sie erfahren, wie Sie JavaScript-Einschleusungsangriffe verhindern, indem Sie die angezeigten Daten codieren. Außerdem erfahren Sie, wie Sie JavaScript-Einschleusungsangriffe verhindern, indem Sie die von Ihnen akzeptierten Daten codieren.
Was ist ein JavaScript-Einschleusungsangriff?
Wenn Sie Benutzereingaben akzeptieren und die Benutzereingaben erneut anzeigen, öffnen Sie Ihre Website für JavaScript-Einschleusungsangriffe. Sehen wir uns eine konkrete Anwendung an, die für JavaScript-Einschleusungsangriffe offen ist.
Stellen Sie sich vor, Sie haben eine Kundenfeedback-Website erstellt (siehe Abbildung 1). Kunden können die Website besuchen und Feedback zu ihren Erfahrungen mit Ihren Produkten eingeben. Wenn ein Kunde sein Feedback übermittelt, wird das Feedback auf der Feedbackseite erneut angezeigt.
Abbildung 01: Kundenfeedback-Website (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Die Kundenfeedback-Website verwendet die controller in Listing 1. Dies controller enthält zwei Aktionen mit dem Namen Index() und Create().
Eintrag 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
Die Index() -Methode zeigt die Index Ansicht an. Diese Methode übergibt das gesamte vorherige Kundenfeedback an die Index Ansicht, indem das Feedback aus der Datenbank abgerufen wird (mithilfe einer LINQ to SQL Abfrage).
Die Create() -Methode erstellt ein neues Feedback-Element und fügt es der Datenbank hinzu. Die Nachricht, die der Kunde im Formular eingibt, wird an die Create() -Methode im Nachrichtenparameter übergeben. Ein Feedback-Element wird erstellt, und die Nachricht wird der Eigenschaft des Feedbackelements Message zugewiesen. Das Feedback-Element wird mit dem Methodenaufruf an die DataContext.SubmitChanges() Datenbank übermittelt. Schließlich wird der Besucher zurück zur Ansicht weitergeleitet, in der Index das gesamte Feedback angezeigt wird.
Die Index Ansicht ist in Listing 2 enthalten.
Eintrag 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>
Die Index Ansicht verfügt über zwei Abschnitte. Der obere Abschnitt enthält das tatsächliche Kundenfeedbackformular. Der untere Abschnitt enthält ein For.. Jede Schleife, die alle vorherigen Kundenfeedbackelemente durchläuft und die Eigenschaften EntryDate und Message für jedes Feedbackelement anzeigt.
Die Kundenfeedback-Website ist eine einfache Website. Leider ist die Website offen für JavaScript-Einschleusungsangriffe.
Stellen Sie sich vor, Sie geben den folgenden Text in das Kundenfeedbackformular ein:
<script>alert("Boo!")</script>
Dieser Text stellt ein JavaScript-Skript dar, das ein Warnungsmeldungsfeld anzeigt. Nachdem jemand dieses Skript in das Feedbackformular übermittelt hat, wird die Nachricht Boo!wird angezeigt, wenn in Zukunft jemand die Kundenfeedback-Website besucht (siehe Abbildung 2).
Abbildung 02: JavaScript-Einschleusung (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Ihre anfängliche Antwort auf JavaScript-Einschleusungsangriffe kann nun Apathie sein. Sie könnten denken, dass JavaScript-Einschleusungsangriffe einfach eine Art von Verunstaltungsangriff sind. Sie glauben vielleicht, dass niemand etwas wirklich Böses tun kann, indem er einen JavaScript-Einschleusungsangriff begeht.
Leider kann ein Hacker einige wirklich, wirklich böse Dinge tun, indem er JavaScript in eine Website einschleust. Sie können einen JavaScript-Einschleusungsangriff verwenden, um einen XSS-Angriff (Cross-Site Scripting) auszuführen. Bei einem Cross-Site Scripting-Angriff stehlen Sie vertrauliche Benutzerinformationen und senden die Informationen an eine andere Website.
Beispielsweise kann ein Hacker einen JavaScript-Einschleusungsangriff verwenden, um die Werte von Browsercookies von anderen Benutzern zu stehlen. Wenn vertrauliche Informationen - wie Kennwörter, Gutschriften Karte Nummern oder Sozialversicherungsnummern - in den Browser-Cookies gespeichert werden, kann ein Hacker einen JavaScript-Injektionsangriff verwenden, um diese Informationen zu stehlen. Oder wenn ein Benutzer vertrauliche Informationen in ein Formularfeld eingibt, das auf einer Seite enthalten ist, die durch einen JavaScript-Angriff kompromittiert wurde, kann der Hacker das eingefügte JavaScript verwenden, um die Formulardaten zu erfassen und an eine andere Website zu senden.
Bitte haben Sie Angst. Nehmen Sie JavaScript-Einschleusungsangriffe ernst, und schützen Sie die vertraulichen Informationen Ihres Benutzers. In den nächsten beiden Abschnitten werden zwei Techniken erläutert, mit denen Sie Ihre ASP.NET MVC-Anwendungen vor JavaScript-Einschleusungsangriffen schützen können.
Ansatz 1: HTML-Codierung in der Ansicht
Eine einfache Methode zum Verhindern von JavaScript-Einschleusungsangriffen ist die HTML-Codierung aller Daten, die von Websitebenutzern eingegeben werden, wenn Sie die Daten in einer Ansicht erneut anzeigen. Die aktualisierte Index Ansicht in Listing 3 folgt diesem Ansatz.
Auflistung 3 – Index.aspx (HTML-codiert)
<%@ 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>
Beachten Sie, dass der Wert von feedback.Message HTML-codiert ist, bevor der Wert mit dem folgenden Code angezeigt wird:
<%=Html.Encode(feedback.Message)%>
Was bedeutet es, eine Zeichenfolge in HTML zu codieren? Beim HTML-Codieren einer Zeichenfolge werden gefährliche Zeichen wie < und > durch HTML-Entitätsverweise wie < und >ersetzt. Wenn die Zeichenfolge <script>alert("Boo!")</script> also HTML-codiert ist, wird sie in <script>alert("Boo!")</script>konvertiert. Die codierte Zeichenfolge wird nicht mehr als JavaScript-Skript ausgeführt, wenn sie von einem Browser interpretiert wird. Stattdessen erhalten Sie die harmlose Seite in Abbildung 3.
Abbildung 03: Besiegter JavaScript-Angriff (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Beachten Sie, dass in der Index Ansicht in Listing 3 nur der Wert von feedback.Message codiert ist. Der Wert von feedback.EntryDate ist nicht codiert. Sie müssen nur die von einem Benutzer eingegebenen Daten codieren. Da der Wert von EntryDate im Controller generiert wurde, müssen Sie diesen Wert nicht in HTML codieren.
Ansatz 2: HTML-Codierung im Controller
Anstelle von HTML-Codierungsdaten, wenn Sie die Daten in einer Ansicht anzeigen, können Sie die Daten direkt vor dem Übermitteln der Daten an die Datenbank html codieren. Dieser zweite Ansatz wird im Fall von controller in Listing 4 verfolgt.
Auflistung 4 – HomeController.cs (HTML-codiert)
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
Beachten Sie, dass der Wert von Message HTML-codiert ist, bevor der Wert innerhalb der Create() Aktion an die Datenbank übermittelt wird. Wenn die Nachricht in der Ansicht erneut angezeigt wird, wird die Nachricht HTML-codiert, und alle javaScript-Elemente, die in die Nachricht eingefügt werden, werden nicht ausgeführt.
In der Regel sollten Sie den ersten Ansatz, der in diesem Tutorial erläutert wird, gegenüber diesem zweiten Ansatz bevorzugen. Das Problem bei diesem zweiten Ansatz besteht darin, dass Sie html-codierte Daten in Ihrer Datenbank erhalten. Mit anderen Worten, Ihre Datenbankdaten sind mit lustig aussehenden Zeichen versehen.
Warum ist das schlecht? Wenn Sie die Datenbankdaten jemals auf einer anderen Seite als einer Webseite anzeigen müssen, treten Probleme auf. Beispielsweise können Sie die Daten nicht mehr einfach in einer Windows Forms-Anwendung anzeigen.
Zusammenfassung
Der Zweck dieses Tutorials war es, Sie über die Aussicht auf einen JavaScript-Einschleusungsangriff zu erschrecken. In diesem Tutorial wurden zwei Ansätze zum Schutz Ihrer ASP.NET MVC-Anwendungen gegen JavaScript-Einschleusungsangriffe erläutert: Sie können entweder vom Benutzer übermittelte Daten in der Ansicht html codieren oder vom Benutzer übermittelte Daten im Controller html codieren.