2010-11-01 5 views
4

J'ai un champ de texte de description dans mon modèle. Non Je souhaite ajouter cette description à la page d'accueil. Mais le texte rend laid à cause de pas de sauts de ligne.sortie HTML d'échappement, mais pas de sauts de ligne

Si je les remplace par <br/> alors les rails leur échappent avec. J'ai donc essayé d'utiliser la méthode raw(). Je veux échapper au mauvais HTML mais avoir les sauts de ligne dans ma sortie.

Je me retrouve avec un code moche.

raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>")) 

Avez-vous des suggestions?

Répondre

2

est ce que vous cherchez

@place.description.html_safe.gsub("\n", '<br/>') 

? Mais à la réflexion, l'utilisation de html_safe ne facilite-t-elle pas l'attaque XSS du site? (car il suppose que le description est sûr).

ne sera donc pas une meilleure solution est

<%= (h @place.description).gsub("\n", '<br/>') %> 

au début, je pensais

<%= (h @place.description).gsub("\n", '<br/>'.html_safe) %> 

est nécessaire, mais en fait les deux versions fonctionnent. J'ai ensuite testé en ajoutant quelques balises HTML à description et il s'est échappé dans &lt; etc, donc il empêche l'attaque XSS.

+0

Cela ne travail. –

+0

J'ai posté ma solution ci-dessous. –

1

est ici une solution qui fonctionne:

<%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %> 

More reading:

Parsing newline characters in textareas without allowing all html tags

Documentation:

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

De sanitize:

Cette aide de sanitize sera html encoder tous les tags et la bande tous les attributs qui ne sont pas spécifiquement autorisés.

Il supprime également les tags href/src avec des protocoles invalides, comme javascript: en particulier. Il fait de son mieux pour contrer les astuces que les pirates peuvent utiliser, comme jeter des valeurs unicode/ascii/hex pour passer les javascript: filters. Découvrez la vaste suite de tests.

Vous pouvez spécifier des balises autorisées avec l'option: tags et des attributs avec l'option: attributes.

2

3 ans plus tard, mais il est jamais trop tard pour une bonne solution de travail

Cela échappera à tous les caractères HTML, mais les sauts de ligne (Linux compatible, Windows et Mac)

html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe 
+0

Merci mille fois –

Questions connexes