36 votes

"Safe" processeur de démarquage pour PHP?

Est-il une implémentation PHP de markdown convient pour une utilisation dans les commentaires du public?

Fondamentalement, il ne doit permettre à un sous-ensemble de la syntaxe markdown (gras, italique, liens, bloc-citations, code-blocs et des listes), et d'en extraire tous les inline HTML (ou peut-être y échapper?)

Je suppose qu'une option est d'utiliser la normale démarque de l'analyseur, et exécuter la sortie via un code HTML désinfectant, mais est-il une meilleure façon de le faire..?

Nous sommes à l'aide de PHP markdown Extra pour le reste du site, donc nous avions déjà eu à utiliser un deuxième analyseur (le non-"Extra" version, puisque les choses comme note de bas de page de soutien est inutile).. Il semble également plus agréable analyse seulement l' *bold* texte et tout avoir échappé à l' &lt;a href="etc"&gt;, que de générer <b>bold</b> de texte et d'essayer de dépouiller les bits que nous ne voulons pas..

Aussi, sur la même note, nous sommes à l'aide de l'ADM de contrôle pour la "main" sur le site, mais pour les commentaires, quels sont les autres options? ADM javascript aperçu, c'est sympa, mais il aurait besoin de la même "stérilisation" comme le PHP markdown processeur (il ne peut pas afficher des images et ainsi de suite, sinon quelqu'un va soumettre et leur travail markdown va "casser")

Actuellement, mon plan est d'utiliser le PHP markdown -> HTML santiser méthode, et de modifier ADM pour supprimer l'image/la tête de la syntaxe à partir de showdown.js - mais il semble que cela a été fait de nombreuses fois avant..

En gros:

  • Est-il un "coffre-fort" markdown implémentation en PHP?
  • Est-il un code HTML/javascript démarque de l'éditeur de ce qui pourrait avoir les mêmes options facilement désactivé?

Mise à jour: j'ai fini par tout simplement l'exécution de l' markdown() sortie par le biais de HTML Purificateur.

De cette façon, le Markdown rendu était distincte de la sortie de la suppression, qui est beaucoup plus simple (deux pour la plupart-non modifié code de bases), plus sécurisé (vous n'êtes pas d'essayer de faire à la fois le rendu et la suppression à la fois), et plus flexible (vous pouvez avoir plusieurs epuration niveaux, dire d'une façon plus relâchée de configuration pour le contenu approuvé, et un beaucoup plus rigoureuses version pour commentaires du public)

27voto

Noah Medling Points 2743

PHP Markdown est un désinfectant option, mais il ne semble pas être annoncés nulle part. Prendre un regard sur les haut de la Markdown_Parser classe markdown.php (qui commence à la ligne 191 dans la version 1.0.1 m). Nous sommes intéressés par des lignes 209-211:

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

Si vous changez de ceux d' true, de balisage et d'entités, respectivement, doivent être échappés plutôt que de insérées telles quelles. Il ne semble pas être en voie de changer (par exemple, via le constructeur), mais vous pouvez toujours en ajouter un:

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

Notez que la fonction ci-dessus crée un nouveau parseur sur chaque course plutôt que la mise en cache comme le fournis Markdown de la fonction (lignes 43-56), de sorte qu'il peut être un peu lent sur le côté.

2voto

Fran Corpier Points 1513

JavaScript Démarque De L'Éditeur Hypothèse:

  • Utiliser un JavaScript-driven Démarque de l'Éditeur, par exemple, basé sur showdown
  • Supprimer toutes les icônes et les indices visuels à partir de la Barre d'outils pour les éléments indésirables
  • Configurer un JavaScript filtre pour nettoyer indésirables de balisage sur la soumission
  • Test et durcir toutes les modifications JavaScript et les filtres en local sur votre ordinateur
  • Miroir de ces filtres dans le PHP script de soumission, pour attraper de même sur le côté serveur.
  • Supprimer toutes les références à des éléments indésirables d'Aide/Tutoriels

J'ai créé un éditeur Markdown en JavaScript, mais il a des caractéristiques améliorées. Qui a pris un gros morceau de temps et SVN révisions. Mais je ne pense pas qu'il serait difficile de modifier un éditeur Markdown pour limiter le HTML autorisée.

-1voto

James Brooks Points 419

Si vous souhaitez écrire votre propre analyseur, pourquoi ne pas utiliser l'architecture BBCode.

Lorsque vous soumettez vos commentaires / (utilisateur), vous devez effacer le texte avec mysql_escape_real_string (). Oui, il existe d'autres fonctions, mais cela arrêtera toutes les injections JS.

-1voto

Brad Robinson Points 5469

Que diriez-vous d'exécuter htmlspecialchars sur l'entrée saisie par l'utilisateur, avant de la traiter via markdown? Il devrait échapper à tout danger, mais laissez tout ce que comprend comprend.

J'essaie de penser à un cas où cela ne fonctionnerait pas mais où je ne pouvais penser à rien au hasard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X