2009-10-21 7 views
3

J'utilise actuellement le code suivant pour aseptiser une chaîne avant de les stocker:code Ruby Désinfecter ... pourquoi est et désinfecté

ERB::Util::h(string) 

Mon problème se produit lorsque la chaîne a déjà été aseptisé comme celui-ci:

string = "Watching baseball `&` football" 

La chaîne aseptisé ressemblera:

sanitized_string = "Watching baseball `&` football" 

Puis-je désinfectez en tournant simplement < en &lt; et> en &gt; par substitution?

+1

On dirait un cas d'utilisation étrange ... désinfectez-vous les choses un nombre variable de fois? Sinon, quel est le problème avec '& amp;' si vous savez que vous l'inverserez quand vous en avez besoin? – ykaganovich

Répondre

3

Unescape d'abord, puis à nouveau échapper:

require 'cgi' 
string = "Watching baseball &amp; football" 

CGI.escapeHTML(CGI.unescapeHTML(string)) 

=> "Watching baseball &amp; football" 
+0

Merci pour l'aide à tous! .. Je vais essayer la première réponse unescape. – tdewell

0

Une approche rapide basée sur this snippet from Erubis.

ESCAPE_TABLE = { '<'=>'&lt;', '>'=>'&gt;' } 
def custom_h(value) 
    value.to_s.gsub(/[<>]/) { |s| ESCAPE_TABLE[s] } 
end 
0

Oui vous pouvez, ou prendre plus, vous pouvez simplement supprimer des balises entières avec une expression régulière de base comme celui-ci:

mystring.gsub(/<(.|\n)*?>/, '') 
0

Vous pouvez écrire votre propre désinfectant pour les mains, mais il y a beaucoup de cas d'angle et bords délicats dans la désinfection.

Une meilleure approche pourrait consister à désencoder votre chaîne avant de l'assainir - est-ce que h() a un inverse que vous pourriez passer vos chaînes en premier?

Questions connexes