Domanda

C'è un'implementazione PHP di Markdown adatto a utilizzare nei commenti pubblici?

In sostanza si dovrebbe consentire solo un sottoinsieme della sintassi Markdown (grassetto, corsivo, link, block-citazioni, codice-blocchi e liste), e la striscia fuori tutto Inline HTML (o forse sfuggire?)

Credo che una possibilità è quella di utilizzare il normale parser Markdown, ed eseguire l'output attraverso un disinfettante HTML, ma c'è un modo migliore di fare questo ..?

Stiamo usando PHP Markdown Extra per il resto del sito, così avremmo già dovuto usare un parser secondario (la versione non "Extra", poiché le cose come il supporto nota non è necessaria) .. Sembra anche bello l'analisi solo il testo *bold* e avere tutto fuggirono a &lt;a href="etc"&gt;, rispetto alla produzione di testo <b>bold</b> e cercando di togliere i bit che non vogliamo ..

Inoltre, in una nota correlata, stiamo usando il controllo ADM per il sito "principale", ma per i commenti, quali altre opzioni ci sono? WMD JavaScript anteprima è bello, ma avrebbe bisogno lo stesso "sterilizzazione", come il processore PHP Markdown (che non possono visualizzare le immagini e così via, altrimenti qualcuno presenteranno e la loro riduzione dei prezzi di lavoro sarà "rompere")

Al momento il mio piano è quello di usare il PHP-mark-down -> HTML santiser metodo, e modificare le WMD per rimuovere l'immagine / voce sintassi da showdown.js - ma sembra che questo è stato fatto innumerevoli volte prima ..

In sostanza:

  • C'è un'implementazione Markdown "sicuro" in PHP?
  • C'è un HTML / JavaScript editor di Markdown che potrebbero avere le stesse opzioni facilmente disattivato?

Aggiornamento:. Ho finito semplicemente eseguendo l'uscita markdown() attraverso HTML Purifier

In questo modo il rendering Markdown era separato dalla sanificazione di uscita, che è molto più semplici (due basi di codice per lo più non modificati) più sicuro (non state cercando di fare entrambe le cose di rendering e sanificazione in una sola volta), e più flessibile (è possibile avere più livelli di sanificazione, dire una configurazione più lassista per i contenuti di fiducia, e una versione molto più severe per i commenti del pubblico)

È stato utile?

Soluzione

PHP Markdown ha un'opzione disinfettante, ma non sembra essere pubblicizzato da nessuna parte. Date un'occhiata al vertice della classe Markdown_Parser in markdown.php (inizia sulla linea 191 nella versione 1.0.1m). Siamo interessati a linee 209-211:

# Change to `true` to disallow markup or entities.
var $no_markup = false;
var $no_entities = false;

Se si cambia coloro ai true, markup e le entità rispettivamente, dovrebbe essere sfuggito, piuttosto che inseriti parola per parola. Non sembra essere un modo integrato di cambiare quelle (ad esempio, tramite il costruttore), ma si può sempre aggiungere uno:

function do_markdown($text, $safe=false) {
    $parser = new Markdown_Parser;
    if ($safe) {
        $parser->no_markup = true;
        $parser->no_entities = true;
    }
    return $parser->transform($text);
}

Si noti che la funzione di cui sopra crea un nuovo parser su ogni corsa, piuttosto che la memorizzazione nella cache è come la funzione fornita Markdown (linee 43-56) lo fa, quindi potrebbe essere un po 'bruttino.

Altri suggerimenti

JavaScript Markdown Editor Ipotesi:

  • Usa un JavaScript-driven Markdown Editor, ad esempio, sulla base di resa dei conti
  • Rimuovi tutte le icone e gli indizi visivi dalla barra degli strumenti per gli elementi indesiderati
  • impostare un filtro JavaScript per pulire-up markup indesiderata su presentazione
  • Prova e indurire tutte le modifiche JavaScript e filtri in locale sul computer
  • Specchio quei filtri nello script PHP sottomissione, per catturare stesso sul lato server.
  • Rimuovi tutti i riferimenti a elementi indesiderati da Aiuto / Tutorial

Ho creato un editor di Markdown in JavaScript, ma ha migliorato le caratteristiche. Che ha preso una grossa fetta di tempo e di revisioni SVN. Ma non credo che sarebbe stato così difficile per alterare un editor di Markdown per limitare il codice HTML consentito.

Se stai cercando di scrivere il proprio parser, perché non utilizzare l'architettura BBCode.

Quando presentando il / (utente) commenti è necessario disinfettare il testo con mysql_escape_real_string (), sì, ci altre funzioni, ma questo si fermerà eventuali iniezioni JS.

Come sull'esecuzione htmlspecialchars sull'utente entrato in ingresso, prima di elaborarlo attraverso Markdown? Esso dovrebbe sfuggire qualcosa di pericoloso, ma lasciare tutto ciò che Markdown capisce.

Sto cercando di pensare a un caso in cui questo non avrebbe funzionato, ma non riesco a pensare a niente fuori mano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top