2014-10-08 16 views
7

के साथ HTML कोड से बचें मैं ब्लॉग टिप्पणी बंडल पर काम कर रहा हूं और मैं मार्कडाउन का उपयोग करके उपयोगकर्ता को कुछ कोड पोस्ट करना चाहता हूं।
मैंTWIG मार्कडाउन

{{ post.content|markdown }} 

असल में पार्स करने के लिए symfony2, TWIG और KNPMarkdownBundle साथ काम कर रहा हूँ, सामग्री अच्छी तरह से markdown पार्स (<code><p> ...) है लेकिन अगर मैं की तरह मेरी सामग्री में कुछ HTML कोड है:

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

कोड से बच नहीं है और मेरे पास एक चेतावनी संदेश है। कृपया कोई बता सकता है कि मैं एक्सएसएस मुद्दों से कैसे निपट सकता हूं? (foo|raw और foo|escape पार्स तोड़ रहे हैं)

+0

तो विशिष्ट की पुष्टि करने के लिए सहयोगी, '{{post.content | escape ('html') | markdown}} 'काम नहीं करता है? संपादित करें: आह, आप कुछ एचटीएमएल – sjagr

+0

के माध्यम से नहीं देना चाहते हैं क्योंकि यह '&' से निकलता है और मेरा आउटपुट '< स्क्रिप्ट > अलर्ट (" ") </स्क्रिप्ट >' –

उत्तर

4

मैं सिर्फ इस समस्या का क्या हुआ, लेकिन जब से strip_tags विशेषताओं, टैग के मानों की रक्षा के लिए पर्याप्त नहीं है, मैं अपने जवाब प्रस्तुत करेगा।

मैं सभी अवांछित HTML तत्वों और विशेषताओं को हटाने के लिए HTML Purifier का उपयोग कर रहा हूं। कमांड कंसोल खोलें और इसे स्थापित करने के लिए निम्न कमांड निष्पादित करें।

$ composer require ezyang/htmlpurifier "^4.6" 

तो फिर तुम अपनी खुद की टहनी एक्सटेंशन बना सकते हैं:

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'; 
    } 
} 

ओपन services.yml और विस्तार रजिस्टर एक सेवा के रूप:

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

अब आप यह

{{ post.content|markdown|html_purifier }} 
साथ उपयोग कर सकते हैं
2

आप टहनी के striptags filter, जैसा कि आपने PHP's strip_tags function विशेष HTML टैग के माध्यम से अनुमति देने के लिए होगा का उपयोग कर सकते हैं:

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

यह अवांछित टैग समाप्त करेंगे पूरी तरह बजाय &lt; और &gt; करने के लिए उन्हें पार्स करने की भी।

हालांकि इसके अलावा, आप write your own Twig filter चाहते हैं यदि आप हर बार "अनुमत टैग" के उसी सेट को आसानी से संदर्भित करना चाहते हैं।

+0

मैं टैग्स रखना चाहता हूं, जैसे आप किसी भी एचटीएमएल सामग्री को पोस्ट कर सकते हैं, जो भी –

+0

आउटपुट है: 'code alert(1) 'मैं जो आउटपुट करना चाहता हूं वह है' ' –

+0

@FabienPapet फिर आपको टवीग का विस्तार करना होगा और अपनी खुद की कस्टम बचने की कार्यक्षमता को चलाने के लिए जाना होगा .. इसके चारों ओर एक रास्ता नहीं है। आपको यह बताते हुए कि कुछ पैराग्राफ में सवाल को व्यापक रूप से उत्तर देने के लिए व्यापक रूप से विस्तृत किया गया है। आप गिटहब प्रोजेक्ट पर कोई समस्या भी खोल सकते हैं या इस कार्यात्मक समस्या को हल करने के लिए स्वयं को बंडल में योगदान दे सकते हैं। [ऐसा लगता है कि कुछ पहले से ही किसी अन्य रूप में ऐसा कर चुके हैं] (https://github.com/KnpLabs/KnpMarkdownBundle/issues/63) – sjagr

5

जैसा कि @ एसजेगर संकेतित है, आप बेहतर अपने स्वयं के जुड़वां विस्तार लिखते हैं। एक बार एक बार मैं एक समान मुद्दे में चला गया हूं और इसे सरल बनाने के लिए एक सरल विस्तार लिखा है जो कि बहुत आसान और आसान था।

नई TWIG टैग:

{{ post.content|yourNewTag }} 

नई TWIG विस्तार वर्ग:

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'; 
     } 
    } 

कॉन्फ़िग:

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

संपादित करें:

TWIG:

आप से बचने के लिए विशिष्ट टैग तो strip_tags साथ allowable_tags ध्वज का उपयोग नहीं करना चाहते हैं() फ़ंक्शन।

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

क्या मैं उस फ़ंक्शन में प्रवेश करते समय सामग्री से बच निकला है? यदि हां, तो मुझे पहले 'कच्चे' निर्दिष्ट करना होगा? –

+0

हां उस फ़ंक्शन में आपका तर्क आपके लिए सब कुछ करेगा। आपको किसी अन्य अंतर्निहित ट्विग एक्सटेंशन का उपयोग नहीं करना पड़ेगा क्योंकि आप वास्तव में इस उदाहरण के साथ एक बना रहे हैं। अधिक जानकारी के लिए – BentCoder

+0

चेकआउट ** ऊपर ** अनुभाग संपादित करें। – BentCoder

 संबंधित मुद्दे