Tipps und Tricks rund um .NET und Visual Studio

Mit AngularJS auf unsichere Eingaben reagieren
Keine Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne “.NETversum” ihr Expertenwissen rund um .NET-Tools und WPF mit. Heute: Der Einsatz von AngularJS als Reaktion auf unsichere Eingaben.

Um zu vermeiden, dass Angreifer, zum Beispiel über Formularfelder, Schadcode in die Anwendung einschleusen, kodiert AngularJS standardmäßig unsichere Inhalte, wie HTML-Elemente, bei der Datenbindung. Das soll hier anhand des Models in Listing 1 veranschaulicht werden.

Listing 1: Eigenschaft mit HTML-Elementen
app.controller("editFlugCtrl", function ($scope) {
  $scope.vm = {};

  $scope.vm.flug = {
  flugNummer: "LH4711",
  von: "Graz",
  nach: "Frankfurt",
  datum: new Date(),
  anmerkungen: "<b>Hallo Welt!</b><a onmouseover='this.textContent = \"Aua!\"'>Klick mich!</a>"
  }
};

Bindet der Entwickler die Eigenschaft anmerkungen, die HTML-Markup beinhaltet, unter Verwendung von {{vm.flug.anmerkungen}}, schreibt AngularJS eine HTML-kodierte Version dieses Markups in die Seite, sodass diese den String ohne Berücksichtigung des Markups wiederspiegelt. Möchte der Entwickler hingegen, dass der Browser das Markup interpretiert, muss er die Direktive ng-bind-html heranziehen:

<span ng-bind-html="vm.flug.anmerkungen"></span>

Um zu verhindern, dass AngularJS auf diesem Weg Schadcode in der Anwendung platziert, erzwingt es eine so genannte Bereinigung (engl. sanitization) des Markups. Ohne diese quittiert ng-bind-html den Dienst mit einer Fehlermeldung. Damit ng-bind-html diese Bereinigung durchführen kann, bindet der Entwickler das Modul ngSanitize ein. Dazu ist die Skriptdatei dieses Moduls zu inkludieren:

<script src="scripts/angular-sanitize/angular-sanitize.min.js"></script>

Darüber hinaus ist das Modul in das eigene zu importieren:

var app = angular.module("flug", ['ngMessages', 'ngSanitize']);

Ist damit die Voraussetzung für die Bereinigung geschaffen, erledigt ng-bind-html den Rest. Im betrachteten Beispiel würde ng-bind-html im Zuge der Datenbindung die Ereignisbehandlungsroutine onmouseover aus dem Markup in der Eigenschaft anmerkungen entfernen.

Der Entwickler hat aber auch die Möglichkeit, einen String manuell zu bereinigen. Dazu lässt er sich die Funktion $sanitize injizieren, an die er den String übergibt. Die Funktion getAnmerkungenSanitized im Model veranschaulicht dies (Listing 2).

Listing 2: Manuelle Bereinigung mit „$sanitize“
app.controller("editFlugCtrl", function ($scope, $sanitize) {
  $scope.vm = {};

  $scope.vm.flug = {
  flugNummer: "LH4711",
  von: "Graz",
  nach: "Frankfurt",
  datum: new Date(),
  anmerkungen: "<b>Hallo Welt!</b><a onmouseover='this.textContent = \"Aua!\"'>Klick mich!</a>",
  getAnmerkungenSanitized: function() { return $sanitize(this.anmerkungen); },
  }
};

Alternativ dazu kann der Entwickler auch explizit einen String als sicher markieren. Dazu besorgt er sich über den Dependency-Injection-Mechanismus von AngularJS den Service $sce (Strict Contextual Escaping). Dieser bietet eine Funktion trustAsHtml, die einen String entgegennimmt und ein als sicher markiertes Gegenstück retourniert (Listing 3). Bindet der Entwickler solch einen String mit ng-bind-html, platziert AngularJS den String ohne Kodierung in der Seite. Im betrachteten Fall würde somit ng-bind-html auch die Ereignisbehandlungsroutine onmouseover einrichten.

Listing 3: String als sicher markieren
app.controller("editFlugCtrl", function ($scope, $sce) {
  $scope.vm = {};

  $scope.vm.flug = {
  flugNummer: "LH4711",
  von: "Graz",
  nach: "Frankfurt",
  datum: new Date(),
  anmerkungen: $sce.trustAsHtml(
  "<b>Hallo Welt!</b><a onmouseover='this.textContent = \"Aua!\"'>Klick mich!</a>")
  }
};

Auch wenn es nicht empfehlenswert erscheint, kann der Entwickler den hier beschriebenen Sicherheitsmechanismus, den die Dokumentation als Strict-Contextual-Escaping-Modus bezeichnet, deaktivieren. Dazu besorgt er sich den Service $sceProvider via Dependency Injection und übergibt false an dessen Funktion enabled:

$sceProvider.enabled(false);

Dies hat zur Folge, dass der Entwickler jeden beliebigen String mit ng-bind-html an die Ausgabe binden darf.

Computer umbenennen

Das Umbenennen eines Computers wird in der .NET-Framework-Klassenbibliothek nicht direkt angeboten. Die Lösung findet man aber in der Windows Management Instrumentation (WMI), die seit .NET 1.0 über die System.Management.dll im Zugriff ist. Zum Einsatz kommt die WMI-Klasse Win32_ComputerSystem, die man auf dem lokalen, aber auch auf einem entfernten System nutzen kann. Es ist also auch möglich, ein entferntes System umzubenennen, sofern man dort administrative Rechte besitzt. Als kleine Besonderheit ist der bisherige Computername im WMI-Pfad gleich zweimal anzugeben, einmal an die Stelle des anzusprechenden Computers und einmal bei der Festlegung des Primärschlüsselattributwerts Name zur Identifizierung der Instanz von Win32_ComputerSystem. Davon gibt es zwar immer nur eine Instanz, aber anders als bei Win32_OperatingSystem ist Win32_ComputerSystem nicht als Singleton-Klasse definiert.

Das Umbenennen erfolgt über die WMI-Methode Rename, die über InvokeMethod() unter Angabe des neuen Namens aufzurufen ist (Listing 4).

Listing 4
  public void RenameComputer(string oldName, string newName)
  {
  // WMI-Pfad zusammensetzen
  var path = @"//" + oldName + @"\root\cimv2:Win32_ComputerSystem.Name='" + oldName + "'";

  // Zugriff auf WMI-Objekt
  var mo = new ManagementObject(path);
  // Informationen aus dem geladenen WMI-Objekt ausgeben
  Console.WriteLine("Aktueller Name: " + mo["Name"].ToString());
  Console.WriteLine("Domain: " + mo["Domain"].ToString());
  Console.WriteLine("Modell: " + mo["Model"].ToString());

  // Parameter für WMI-Methodenaufruf zusammensetzen
  ManagementBaseObject inputArgs = mo.GetMethodParameters("Rename");
  inputArgs["Name"] = newName;
  // WMI-Methode aufrufen
  ManagementBaseObject ergebnis = mo.InvokeMethod("Rename", inputArgs, null);
  // Ergebnis ausgeben
  WMIUtil.Print("Rückgabewert: " + (ergebnis != null ? ergebnis["ReturnValue"].ToString() : "?"));
  // Ausgabe des neuen Namens
  Console.WriteLine(("Neuer Name: " + newName));
  }

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. Außerdem ist der Windows Developer weiterhin als Print-Magazin im Abonnement erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Abonnieren
Benachrichtige mich bei
guest
0 Comments
Inline Feedbacks
View all comments
X
- Gib Deinen Standort ein -
- or -