Question

Y at-il une implémentation PHP de démarquage adapté pour l'utilisation dans les commentaires du public?

Fondamentalement, il ne doit permettre à un sous-ensemble de la syntaxe Markdown (gras, italique, liens, bloc-citations, le code-blocs et listes), et dépouiller tous les fichiers HTML en ligne (ou échapper peut-il?)

Je suppose que d'une option est d'utiliser l'analyseur démarquage normal et le rediriger vers un assainisseur HTML, mais est-il une meilleure façon de le faire ..?

Nous utilisons PHP Markdown Extra pour le reste du site, donc nous avions déjà d'utiliser un analyseur secondaire (la version non « Extra », étant donné que des choses comme le soutien note est inutile) .. Il semble aussi plus belle analyse que le texte de *bold* et tout ce qui a échappé à &lt;a href="etc"&gt;, que de générer du texte <b>bold</b> et en essayant de dépouiller les bits que nous ne voulons pas ..

En outre, sur une note liée, nous utilisons le contrôle des ADM pour le site « principal », mais pour les commentaires, ce sont les autres options? ADM de javascript aperçu est agréable, mais il aurait besoin de la même « stérilisation » que le processeur de démarquage PHP (il ne peut pas afficher des images et ainsi de suite, sinon quelqu'un soumettront et leur démarquage de travail « pause »)

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

En gros:

  • Yat-il un "sûr" la mise en œuvre de démarquage en PHP?
  • Y at-il un HTML / Javascript éditeur de Markdown qui pourrait avoir les mêmes options facilement désactivée?

Mise à jour:. J'ai fini simplement courir la sortie markdown() par HTML Purifier

De cette façon, le rendu Markdown était séparé de aseptisation de sortie, ce qui est beaucoup plus simple (deux bases de code pour la plupart-non modifiés) plus sûr (vous n'êtes pas essayer de faire les deux rendu et aseptisation à la fois), et plus souple (vous pouvez ont plusieurs niveaux de sanitisation, par exemple une configuration plus laxiste pour le contenu de confiance, et une version beaucoup plus stricte pour les commentaires du public)

Était-ce utile?

La solution

PHP Markdown a une option de désinfectant pour les mains, mais il ne semble pas être annoncés nulle part. Jetez un oeil à la partie supérieure de la classe Markdown_Parser en markdown.php (commence sur la ligne 191 dans la version 1.0.1m). 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 ceux true, le balisage et les entités, respectivement, doivent être échappé plutôt que inséré in extenso. Il ne semble pas y avoir de façon intégrée pour changer les (par exemple, par le constructeur), mais vous pouvez toujours 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 nouvel analyseur sur chaque course plutôt que la mise en cache comme la fonction Markdown fourni (lignes 43-56) fait, et donc peut-être un peu lent sur le côté.

Autres conseils

JavaScript Markdown Editor Hypothesis:

  • Utilisez un éditeur Markdown axée sur JavaScript, par exemple, basé sur showdown
  • Supprimer toutes les icônes et indices visuels de la barre d'outils pour les éléments indésirables
  • Mettre en place un filtre JavaScript pour nettoyer des balises indésirables sur la soumission
  • Test et durcir tous les changements et les filtres JavaScript localement sur votre ordinateur
  • Miroir ces filtres dans le script de soumission de PHP, pour attraper même sur le côté serveur.
  • Retirez toutes les références à des éléments indésirables Aide / Tutorials

J'ai créé un éditeur Markdown en JavaScript, mais il a des caractéristiques améliorées. Cela a pris une grande partie du temps et des révisions SVN. Mais je ne pense pas que ce serait si difficile de modifier un éditeur de Markdown pour limiter le HTML autorisée.

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

Lorsque vous soumettez votre / (utilisateur) Les commentaires que vous devez aseptiser le texte avec mysql_escape_real_string (), oui il y a d'autres fonctions, mais cela bloquera tous les JS Injections.

Qu'en est-il en cours d'exécution sur htmlspecialchars l'utilisateur est entré entrée, avant de le traiter par démarquage? Il devrait échapper à quelque chose de dangereux, mais laisser tout ce qui comprend démarquage.

Je suis en train de penser à un cas où cela ne fonctionnerait pas mais ne peut pas penser à quelque chose de la main.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top