2009-09-06 10 views
6

Les utilisateurs peuvent modifier "articles" dans mon application. Chaque article est maîtrisé dans la base de données et envoyé au client en tant que Markdown - je le convertis en client HTML avec JavaScript.Désactiver Markdown dans Rails?

Je le fais de sorte que lorsque l'utilisateur veut éditer l'article, il peut éditer et POSTER le Markdown directement sur le serveur (puisqu'il est déjà sur la page).

Ma question est comment désinfecter le Markdown que j'envoie au client - puis-je simplement utiliser l'assistant sanitize de Rails?

En outre, des réflexions sur cette approche en général? Une autre stratégie à laquelle je pensais était de rendre et de désinfecter le code HTML sur le serveur, et de tirer le Markdown vers le client uniquement si l'utilisateur voulait éditer l'article.

Répondre

4

je suis un des directeurs de couple:

  • magasin ce que les types d'utilisateurs
  • désinfectent sur l'écran
  • envoyer uniquement les données nécessaires

Cela me conduit à l'architecture alternative que vous suggérer:

  • st démarquage de minerai dans la base de données
  • sur render, démarquage/désinfectez et envoyer HTML au navigateur
  • quand (et si) l'utilisateur choisit « Edit », demander au démarquage brut à partir du serveur via AJAX
  • si je une vue "prévisualisation" pendant l'édition, j'essaie d'utiliser le serveur pour le rendre aussi (bien que vous puissiez avoir besoin de supprimer cette étape si c'est trop lent). Pendant l'aperçu, cependant, la désinfection peut ne pas être si critique.

Cela a été mon approche et cela fonctionne assez proprement.

0

Je n'ai pas utilisé Markdown in Rails, mais mon approche serait de prendre le Markdown soumis et de le stocker, ainsi qu'une copie rendue HTML et aseptisée, dans la base de données. De cette façon, vous ne jetez aucune information dans votre nettoyage, et vous n'êtes pas obligé de re-rendre le Markdown chaque fois que vous voulez afficher un article.

L'assistant d'assainissement de Rails devrait faire l'affaire. Il y a aussi un certain nombre de plugins (tels que xss_shield et xss_terminate) qui peuvent être utilisés pour ajouter votre sortie à la liste blanche, juste pour vous assurer de ne pas oublier de désinfecter!

+0

Et lorsque l'utilisateur clique sur "modifier" sur l'article, télécharger la source Markdown du serveur via AJAX? –

+0

C'est vrai. Sinon, dans votre Markdown -> HTML nettoyé -> Markdown conversion, vous risquez de perdre des données que vous ne devriez pas être. – nfm

+0

Pourquoi stocker le code HTML aseptisé? vous pouvez tout aussi bien utiliser la mise en cache des fragments, puis expirer le cache lors du changement de démarque. –

4

Les autres réponses ici sont bonnes, mais laissez-moi faire quelques suggestions sur la désinfection. Le désinfectant intégré de Rails est décent, mais il ne garantit pas une bonne formation qui tend à être la moitié du problème. Il est également assez susceptible d'être exploité car ce n'est pas le meilleur de sa catégorie et il a une grande empreinte d'installation pour que les pirates attaquent. Je pense que l'optimisation la plus avancée et la plus efficace à l'heure actuelle est html5lib car elle est écrite pour être analysée comme un navigateur, et c'est une collaboration de beaucoup de leaders dans le domaine. Cependant c'est un peu lent et pas très Ruby.

Dans Ruby Je recommande soit Loofah qui soulève quelques-uns des trucs Sanitization html5 mot pour mot, mais utilise Nokogiri et fonctionne beaucoup plus rapidement ou Sanitize qui dispose d'une suite de test solide et très bon configurabilité (ne vous tirez pas dans le pied si).

Je viens de publier un plugin appelé ActsAsSanitiled qui est une réécriture de ActsAsTextiled pour désinfecter automagiquement la sortie textiled en utilisant la gemme Sanitize. Il est conçu pour vous offrir le meilleur des deux mondes: l'entrée n'est pas touchée dans la base de données, mais le champ génère toujours du HTML sécurisé sans avoir besoin de se souvenir de quoi que ce soit dans le modèle. Je n'utilise pas Markdown moi-même, mais je considérerais ajouter le support de BlueCloth.

+0

Merci. Si vous finissez par prendre en charge Markdown, RDiscount est beaucoup mieux que BlueCloth (plus rapide, a le support "Smarty") –

Questions connexes