Verhindern Sie Cross-Site-Scripting


8

Eines der Sicherheitsprinzipien ist die Bereinigung von Zeichenfolgen und Variablen, die vom Client an den Server übergeben werden. In einfachem PHP gibt es einige Funktionen, um XSS - Schwachstellen ( Cross-Site Scripting ) zu verhindern :

Welche Strategie verfolgt Drupal 8, um XSS-Angriffe zu verhindern? Wie kann ich Client-Datenpost bereinigen, um meine Site vor XSS-Angriffen zu schützen?

Ich erinnere mich, dass Drupal 7 filter_xss()XSS-Schwachstellen verhindern muss, aber was ist die Drupal 8-Strategie gegen XSS-Schwachstellen?


Sehen Sie sich auch an, wie Sie einen Content-Security-Policy-Header für Ihre Site als zusätzliche XSS-Schutzschicht definieren ( drupal.org/project/csp ). Leider ist Drupal 8 aufgrund der Verwendung von CKEditor 4 noch nicht in der Lage, Inline-Skripte vollständig zu blockieren. Die jüngsten Aktualisierungen der CSP-Spezifikation ermöglichen jedoch zumindest eine Einschränkung, welche Inline-Skripte nach der Übernahme durch Browser zulässig sind.
Gapple

Antworten:


10

Desinfektion der Ausgabe, um XSS-Angriffe (Cross Site Scripting) zu vermeiden

Twig-Vorlagen verwenden Die Twig-Theme-Engine maskiert jetzt standardmäßig automatisch alles. Das bedeutet, dass jede Zeichenfolge, die aus einer Twig-Vorlage gedruckt wird (z. B. irgendetwas dazwischen {{ }}), automatisch bereinigt wird, wenn keine Filter verwendet werden.

Informationen zu den in Drupal verfügbaren Zweigfiltern finden Sie unter Filter - Ändern von Variablen in Zweigvorlagen.

Um das automatische Escaping von Twig zu nutzen (und zu vermeiden, dass sicheres Markup maskiert wird), sollte idealerweise sämtliches HTML aus Twig-Vorlagen ausgegeben werden.

API-Funktionen Verwenden Sie t () und \Drupal::translation()->formatPlural() mit @oder %Platzhalter, um sichere, übersetzbare Zeichenfolgen zu erstellen. Weitere Informationen finden Sie unter Code-Textübersetzungs-API in Drupal 8 .

Von t (), Html :: Escape (), Xss :: Filter () oder Xss :: FilterAdmin () bereinigte Zeichenfolgen werden automatisch als sicher markiert, ebenso wie Markup-Zeichenfolgen, die aus Render-Arrays über Renderer erstellt wurden .

Es kann zwar auch Text bereinigen, es ist jedoch fast nie korrekt, check_markup in einem Thema oder Modul zu verwenden, außer im Kontext eines Textbereichs mit einem zugehörigen Textformat.

Quelle: Drupal 8: Schreiben von sicherem Code von: Rade, Shyamala, Robert Castelo und Pere Orga.


1

Zweigvorlagen haben die Ausgabe in meiner Anwendung nicht bereinigt. Eine Skriptzeichenfolge oder ein XSS-Angriff, der in ein Kommentarfeld eingegeben und gespeichert wurde, wurde beim Laden der Seite ausgeführt. Stattdessen habe ich das Problem gelöst, indem ich jedes String-Eingabefeld in bereinigt habe hook_ENTITY_TYPE_load.

 if(isset($entity->$fieldName)) {  
        $value = $entity->get($fieldName)->value;  
        $value =  htmlspecialchars($value);  
        $entity->set($fieldName, $value);  
 }  

0

Drupal verfolgt im Allgemeinen den Ansatz, nach Ausgabe zu filtern, nicht nach Eingabe.

Ein Modul, das die Eingabe einer Person als nicht Teil des Feldsystems akzeptiert, muss sie bei der Ausgabe filtern (auch von privilegierten Administratorbenutzern). Die Ausgabe erfolgt normalerweise als Render-Array. Eine einfache Möglichkeit, dies zu tun, besteht darin, die zulässigen Tags beim Rendern zu begrenzen. So nehmen Sie ein Beispiel aus der Ausgabe eines Termlabels durch das Taxonomiemodul :

use Drupal\Component\Utility\Xss;

...

  public function termTitle(TermInterface $taxonomy_term) {
    return [
      '#markup' => $taxonomy_term->getName(),
      '#allowed_tags' => Xss::getHtmlTagList(),
    ];
  }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.