2017-12-08 52 views
1

Um systematisch XSS-Fehler zu blockieren, behandelt Angular standardmäßig alle Werte als nicht vertrauenswürdig. Wenn ein Wert aus einer Vorlage über eine Eigenschaft, ein Attribut, einen Stil, eine Klassenbindung oder eine Interpolation in das DOM eingefügt wird, bereinigt Angular die nicht vertrauenswürdigen Werte und entfernt sie.In welchem ​​Maße habe ich Bedenken hinsichtlich der Sicherheit (XSS) beim Umgang mit Benutzereingaben in Angular?

Winkelschablonen entsprechen ausführbarem Code: HTML, Attribute und Bindungsausdrücke (aber nicht die gebundenen Werte) in Vorlagen werden als sicher betrachtet. Das bedeutet, dass Anwendungen verhindern müssen, dass Werte, die ein Angreifer kontrollieren kann, jemals in den Quellcode einer Vorlage gelangen. Generieren Sie Vorlagenquellcode niemals durch Verketten von Benutzereingaben und Vorlagen. Um diese Sicherheitsanfälligkeiten zu vermeiden, verwenden Sie den Offline-Vorlagencompiler, der auch als Vorlageninjektion bezeichnet wird.

Dies ist, was Angular über XSS sagt. Es scheint jedoch, dass der erste Absatz dem zweiten widerspricht (bitte korrigiere mich, wenn ich falsch liege). Meine Frage ist also: Muss ich fliehen und meine Benutzereingaben bereinigen?

+0

Ich werde es nicht als Antwort posten, aber das ist meine Meinung: Meiner Meinung nach, wenn Sie verkleinerten Code ohne die '.map' Dateien auf Produktion und einige Validierungen für Felder zum Beispiel' max' Werte, nur 'strings' oder' numbers' erlaubt (je nach Fall) und Sie senden diese Daten einfach an einen Backend-Dienst als JSON-String, Sie haben "Ihren Teil getan". Es liegt an den Backend-Frameworks und den Entwicklern, den Rest zu erledigen. Wenn jemand mehr hinzuzufügen hat und spezifische Beispiele, wie XSS zu verhindern, bitte teilen :) – DrNio

Antwort

1

Code ist vertrauenswürdig, aber Werte nicht. Wenn Sie Werte mit der normalen Angular-Datenbindung einfügen, werden sie entsprechend codiert, da Angular erkennen kann, was ein Wert ist und was Code ist.

Zum Beispiel dies erfordert keine zusätzlichen Entkommen:

<h1>Hello {{yourName}}!</h1> 

Aber wenn man versucht, eine Vorlage mit String-Verkettung zu erstellen. Zum Beispiel:

'<h1>Hello ' + yourName + '!</h1>' 

oder mit einer serverseitigen Sprache wie PHP:

<h1>Hello <?= $_GET['name'] ?> !</h1> 

Angular Dann können die Differenz zwischen dem wörtlichen html nicht sagen und dem eingefügten Wert. Daten, die so eingefügt werden, können jetzt sowohl Javascript als auch Angular-Syntax einfügen.

Solange Sie sich an die normalen Angular-Mechanismen zum Einfügen von Werten halten, brauchen Sie keine zusätzliche Codierung. Die Sicherheitslücken entstehen durch das Umgehen von Winkel- und Einfügewerten direkt auf andere Weise.

+0

'[innerHTML] =" getText() "' mit getText: 'return 'test'' muss dies dann maskiert werden? –

+0

@MartijnvandenBergh Sie sollten '[innerHTML]' nur verwenden, wenn der Wert, den Sie einfügen, tatsächlich HTML und kein einfacher Text ist. Dann liegt es in der Verantwortung des Codes, der den HTML-Code generiert hat, um alle Werte zu entfernen, die in ihn eingefügt wurden, abhängig davon, wie er generiert wurde. Daher müssen alle Werte, die mit einer Verkettung in diesem hinzugefügt werden, maskiert werden. – fgb

Verwandte Themen