2015-07-25 7 views
0

Je me demandais quand il est sûr d'utiliser html_safe et quand non. J'ai lu que vous ne voulez pas faire ceci si le code peut contenir le contenu d'utilisateur. Qu'est-ce que cela signifie en pratique?Comment utiliser html_safe de manière sécurisée?

flash[:danger]="Dear #{@user.username} <br> please take a look #{view_context.link_to('here', some_path)}" <br> Your organization #{@user.organizationname} bla bla" 

Par exemple, pour un message flash comme celui-ci, il faudra html_safe pour afficher correctement, mais il contient également dans ce cas username et organizationname qui est contenu entré par l'utilisateur. Est-il encore sûr d'utiliser html_safe ...?

Répondre

2

Si vous injectez le contenu de l'utilisateur en chaînes vous rendre avec html_safe vous devez vous assurer que tout le contenu injecté est sanitized

flash[:danger]="Dear #{ActionController::Base.helpers.sanitize @user.username} <br> please take a look #{view_context.link_to('here', some_path)}" <br> Your organization #{ActionController::Base.helpers.sanitize @user.organizationname} bla bla" 

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

+0

Comment est-ce en ce qui concerne les messages d'erreur partagés? J'ai: '<% object.errors.full_messages.each faire | msg | %> ''

  • <% = msg.html_safe%>
  • '' <% end %> '. Est-il préférable de changer cela en: '<% = aseptise msg.html_safe%>' ou '<%= msg %>'? Au meilleur de ma connaissance, je n'ai que des messages d'erreur personnalisés en texte brut, mais on ne sait jamais, étant donné les gemmes utilisées ... Que diriez-vous est la meilleure pratique pour les messages d'erreur partagés? – Marty

    +0

    Je pense qu'il est courant et pratique courante d'avoir du texte brut uniquement dans les messages d'erreur d'enregistrement actif. Je n'ai jamais vu quelqu'un faire 'html_safe' sur eux. Donc, je voudrais absolument omettre le html_safe pour la sécurité supplémentaire jusqu'à ce que vous en ayez vraiment besoin. Je ne pense pas qu'un fournisseur de gem raisonnable fasse ou doive placer le HTML dans les messages d'erreur d'enregistrement actifs. –

    1

    De façon générale, il n'est pas, l'utilisateur malveillant pourrait entrer dans certains js code nuisible que son organizationname, et ce code ferait partie de votre application - vous ne voulez pas cela. Cette attaque est connue sous le nom Cross-site scripting (XSS), et vous pouvez lire à ce sujet-à-dire ici: http://www.jasonwieringa.com/Learning-About-XSS-Attacks-in-Rails/

    qu'Axel a, vous devez appeler sanitize sur chaque entrée d'utilisateur que vous souhaitez marquer comme html_safe ce qu'il fait remplace tous les caractères spéciaux html en tant qu'entités, donc tout balisage indésirable ou code js ne sera pas interprété par le navigateur de l'utilisateur.