2009-08-12 9 views
6

Quelles sont les pratiques pour empêcher XSS dans Ruby on Rails? J'ai trouvé beaucoup de vieux docs sur le web et la plupart du temps il s'agissait d'utiliser h/html_escape helper pour échapper toute variable provenant des utilisateurs.Ruby on Rails et prévention XSS

I comprise à partir de nouveaux documents que dans la version 2.0 et au-dessus, il est désinfecter méthode qui nettoie automatiquement l'entrée de la soi-disant entrée malveillant. Est-ce suffisant ou faites-vous quelque chose de plus pour sécuriser vos applications ?

Répondre

10

Le Ruby on Rails Security Guide est assez complet sur les problèmes spécifiques à Rails que vous devez prendre en compte lors de la conception de la sécurité pour votre site Web.

15

La méthode h est toujours le chemin à parcourir pour échapper tout le code HTML à l'intérieur d'une chaîne. Vous devez utiliser cette méthode partout où vous envoyez du contenu.

<%=h @recipe.description %> 

Ce comportement va changer dans Rails 3. toutes les sorties seront échappées par défaut et vous devrez spécifier explicitement pour échapper à pas. En attendant, si vous oubliez souvent d'utiliser cette méthode h, vous voudrez peut-être consulter le Safe ERB plugin.

La méthode sanitize est un bon moyen de supprimer sélectivement certaines balises du contenu. Par exemple, si vous souhaitez autoriser l'utilisateur à mettre en gras et à mettre en italique sa sortie en ajoutant des liens, vous pouvez le faire.

<%= sanitize @recipe.description, :tags => %w[b i a], :attributes => %w[href] %> 

Comme Oliver mentionné, consultez la Security Guide pour plus d'informations.

4

En ce qui concerne les meilleures pratiques, je recommande ce qui suit:

  1. Utilisez toujours les rails forment des aides (form_for, etc.), si vous écrivez votre propre formulaire, vous vous ouvrez aux attaques CSRF. Alors que l'utilisation de la fonction h() va échapper du texte comme il est écrit sur une page, vous vous retrouverez avec les exploits XSS enregistrés dans votre base de données. L'utilisation de l'entrée XSS_terminate permet de supprimer les entrées lors de leur enregistrement. N'oubliez pas que votre application fonctionne sur une pile d'autres applications (Rails, Apache, MySQL, le système d'exploitation de votre choix), qui ont toutes leurs propres problèmes de sécurité.

2

Les rails désinfecte méthode est assez bonne, mais il ne garantit pas bien formedness, et il est tout à fait susceptible d'être attaqué en raison de la base installée. Une meilleure pratique consiste à utiliser soit html5lib (vraiment le meilleur, sinon le plus rapide ou le plus rubis) ou Sanitize ou Loofah