Comment HTML encode / échapper à une chaîne? Y at-il intégré?
-
22-08-2019 - |
Question
J'ai une chaîne que je veux untrusted montrer sous forme de texte dans une page HTML. J'ai besoin pour échapper aux caractères de la <
»et « &
» comme des entités HTML. Moins de bruit le mieux.
J'utilise UTF8 et ne pas avoir besoin d'autres entités pour les lettres accentuées.
Y at-il une fonction intégrée dans Ruby ou Rails, ou devrais-je rouler mon?
La solution
La méthode helper h
:
<%=h "<p> will be preserved" %>
Autres conseils
Voir la classe de Ruby CGI. Il existe des méthodes pour coder et décoder HTML ainsi que les URL.
CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo "bar" <baz>"
Dans Ruby on Rails 3 HTML seront échappées par défaut.
Pour les chaînes non échappés utilisent:
<%= raw "<p>hello world!</p>" %>
ERB :: Util.html_escape peut être utilisé partout. Il est disponible sans utiliser require
dans Rails.
Un ajout à la réponse de Christopher Bradford à utiliser le code HTML échapper partout,
puisque la plupart des gens n'utilisent pas CGI
de nos jours, vous pouvez également utiliser Rack
:
require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
Vous pouvez utiliser h()
ou html_escape()
, mais la plupart des gens utilisent h()
par convention. h()
est l'abréviation de html_escape()
dans des rails.
Dans votre contrôleur:
@stuff = "<b>Hello World!</b>"
Selon vous:
<%=h @stuff %>
Si vous affichez la source HTML: vous verrez la sortie sans BOLDING les données. C'est à dire. il est codé comme <b>Hello World!</b>
.
Il apparaît une affiche comme <b>Hello World!</b>
Comparaison des différentes méthodes:
> CGI::escapeHTML("quote ' double quotes \"")
=> "quote ' double quotes ""
> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote ' double quotes ""
> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote ' double quotes ""
J'ai écrit mon propre être compatible avec Rails ActiveMailer échapper:
def escape_html(str)
CGI.escapeHTML(str).gsub("'", "'")
end
h()
est également utile pour échapper à des citations.
Par exemple, j'ai vue qui génère un lien en utilisant un champ de texte result[r].thtitle
. Le texte pourrait inclure des guillemets simples. Si je n'ai pas échappé result[r].thtitle
dans la méthode de confirmation, le Javascript briserait:
<%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action =>:delete_resourced,
:id => result[r].id,
:th => thread,
:html =>{:title=> "<= Remove"},
:confirm => h("#{result[r].thtitle} will be removed"),
:method => :delete %>
<a href="#" onclick="if (confirm('docs: add column &apos;dummy&apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="<= Remove">docs: add column 'dummy'</a>
Note:. La déclaration de titre :html
est magique échappé par Rails