2014-10-08 4 views
7

Ich arbeite an einem Blog-Kommentar-Bundle und ich möchte Benutzer Code mit Markdown veröffentlichen lassen.
ich mit Symfony2, TWIG arbeite und KNPMarkdownBundle fürEscape HTML-Code mit TWIG Markdown

Parsen Eigentlich
{{ post.content|markdown }} 

, ist der Inhalt gut Abschlags analysiert (<code><p> ...), aber wenn ich habe einige HTML-Code in meinem Inhalt wie:

Some content 
``` <script>alert("hello world");</script> ``` 

Der Code ist nicht maskiert und ich habe eine Warnmeldung. Kann mir jemand erklären, wie ich mit XSS-Problemen umgehen kann? (foo|raw und foo|escape brechen Parsing)

+0

Also zur Bestätigung spezifisch Verbündeter, '{{post.content | escape ('html') | markdown}}' funktioniert nicht? EDIT: Ah, Sie wollen bestimmte HTML durch – sjagr

+0

Nein, weil es das '&' und meine Ausgabe ist '<script> alert (" ") ' –

Antwort

4

Ich war zufällig gerade dieses Problem haben, aber da strip_tags nicht genug Werte im Attribute-Tag zu schützen, werde ich meine Antwort einreichen.

Ich verwende HTML Purifier, um alle unerwünschten HTML-Elemente und Attribute zu entfernen. Öffnen Sie eine Befehlskonsole und führen Sie den folgenden Befehl aus, um sie zu installieren.

$ composer require ezyang/htmlpurifier "^4.6" 

Dann können Sie Ihre eigenen Zweig Erweiterung erstellen:

namespace AcmeBundle\Twig; 

class HTMLPurifierExtension extends \Twig_Extension 
{ 
    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('html_purifier', array($this, 'purify'), array('is_safe' => array('html'))), 
     ); 
    } 

    public function purify($text) 
    { 
     $elements = array(
      'p', 
      'br', 
      'small', 
      'strong', 'b', 
      'em', 'i', 
      'strike', 
      'sub', 'sup', 
      'ins', 'del', 
      'ol', 'ul', 'li', 
      'h1', 'h2', 'h3', 
      'dl', 'dd', 'dt', 
      'pre', 'code', 'samp', 'kbd', 
      'q', 'blockquote', 'abbr', 'cite', 
      'table', 'thead', 'tbody', 'th', 'tr', 'td', 
      'a[href|target|rel|id]', 
      'img[src|title|alt|width|height|style]' 
     ); 

     $config = \HTMLPurifier_Config::createDefault(); 
     $config->set('HTML.Allowed', implode(',', $elements)); 

     $purifier = new \HTMLPurifier($config); 
     return $purifier->purify($text); 
    } 

    public function getName() 
    { 
     return 'html_purifier'; 
    } 
} 

öffnen services.yml und registrieren die Erweiterung als Dienstleistung:

services: 
    acme.html_purifier_extension: 
     class: AcmeBundle\Twig\HTMLPurifierExtension 
     public: false 
     tags: 
      - { name: twig.extension } 

Jetzt können Sie es mit

{{ post.content|markdown|html_purifier }} 
2

Sie Zweig des verwenden können striptags filter genau wie Sie würde PHP's strip_tags function bestimmte HTML-Tags zu ermöglichen, durch:

{{ post.content|striptags('<code><p><br>')|markdown }} 

Diese unerwünschte Tags beseitigen vollständig, anstatt sie zu &lt; Parsen und &gt; auch.

Abgesehen davon, möchten Sie vielleicht write your own Twig filter für den Fall, dass Sie einfach die gleiche Menge von "zulässigen Tags" jedes Mal verweisen möchten.

+0

Ich möchte Tags, wie in SO Sie behalten kann jeden HTML-Inhalt, was auch immer es ist, posten –

+0

Ausgabe: 'code alert(1)' Was ich ausgeben möchte ist ' ' –

+0

@FabienPapet Dann wirst du Twig erweitern müssen und deine eigene benutzerdefinierte Escape-Funktion ausführen müssen ... nicht viel herum. Wenn Sie mir sagen, wie das geht, ist die Frage zu weit gefasst, um in ein paar Absätzen auf den Punkt gebracht zu werden. Sie können auch ein Problem im GitHub-Projekt öffnen oder selbst zum Bündel beitragen, um dieses funktionale Problem zu beheben. [Es scheint, dass ein paar bereits in einer anderen Form getan haben] (https://github.com/KnpLabs/KnpMarkdownBundle/issues/63) – sjagr

5

Wie @sjagr angedeutet hat, schreiben Sie besser Ihre eigene Zweigverlängerung. Es war einmal ein ähnliches Problem und ich habe gerade eine einfache Erweiterung geschrieben, um es zu sortieren, was sehr einfach und einfach war.

NEW TWIG TAG:

{{ post.content|yourNewTag }} 

NEW TWIG VERLÄNGERUNG DER KLASSE:

namespace Car\BrandBundle\Twig; 

    class YourNewTagExtension extends \Twig_Extension 
    { 
     public function yourNewTagFilter($param) 
     { 
      // Escape your content as you wish with some logic and return it 
      return $escaped; 
     } 

     public function getFilters() 
     { 
      return array(new \Twig_SimpleFilter('yourNewTag', array($this, 'yourNewTagFilter'))); 
     } 

     public function getName() 
     { 
      return 'yourNewTag_extension'; 
     } 
    } 

CONFIG:

services: 
    car.twig.yourNewTag_extension: 
     class: Car\BrandBundle\Twig\YourNewTagExtension 
     tags: 
      - { name: twig.extension } 

EDIT:

TWIG:

Wenn Sie nicht wollen, bestimmte Tags verwenden Sie dann allowable_tags Flagge mit strip_tags() Funktion entkommen.

public function yourNewTagFilter($param) 
{ 
    $escaped = strip_tags($param); 
    // Do something else as well if you want 

    return $escaped; 
    // This will print alert("hello world"); as output in your webpage 
} 
+0

Ist der Inhalt entkommen, wenn ich in dieser Funktion eingeben? Wenn ja, muss ich vorher '| raw' angeben? –

+0

Ja Ihre Logik in dieser Funktion wird alles für Sie tun. Sie müssen keine anderen integrierten Zweig-Erweiterungen verwenden, da Sie tatsächlich eine mit diesem Beispiel erstellen. – BentCoder

+0

Checkout ** EDIT ** Abschnitt oben für weitere Informationen. – BentCoder