2015-04-05 1 views
0

En expérimentant avec mon formulaire Rails, je trouve qu'insérer <scrip>alert("hello")</script> dans un champ text_field me donne deux résultats différents. Lorsque j'utilise la valeur, par exemple dans une page d'affichage, elle est automagicalement échappée. Lorsque j'utilise la valeur sous un nouveau format, par exemple pour permettre l'édition par l'utilisateur, elle n'est pas échappée et j'obtiens la fenêtre contextuelle d'alerte. Après beaucoup de recherches, j'ai trouvé que text_area a un booléen d'échappement qui empêche cela, mais pas text_field. La plupart des choses qui arrivent sur google concernent les échappements dans les templates erb, ce qui ne semble pas fonctionner avec un formulaire. Il y a quelques indications que les données devraient être nettoyées dans la base de données, mais peu de conseils sur la meilleure façon de le faire --- en dehors de l'utilisation de solutions anciennes par exemple xssterminate qui semble remonter à Rails 2. Même la sécurité RoR Le guide se concentre sur la désinfection de la sortie erb plutôt que sur la détermination de l'entrée.Rails forment text_field échapper html

Deux questions.

  1. Quelle est l'approche la plus pratique actuelle à désinfectante entrée text_field avant qu'il ne soit sauvé? (par exemple: dans le formulaire, le contrôleur ou le modèle Quelles sont les gemmes considérées comme actuelles?)
  2. Peu importe, parce que je suis paranoïaque, comment désinfecter le champ text_field lors de l'affichage des données db?

Répondre

1

La gemme loofah-activerecord (https://github.com/flavorjones/loofah-activerecord) semble être votre meilleur choix pour la désinfection des données à leur entrée dans la base de données. L'utilisation de xss_foliate sur vos modèles supprimera les tags de toutes les colonnes par défaut.

par exemple.

class User < ActiveRecord::Base 
    xss_foliate 

    ... 
end 

Je n'ai pas trouvé une solution au 2ème point, mais serait très désireux de savoir s'il y a un!

+0

Je suis allé avec une méthode personnalisée qui rejette l'entrée de l'utilisateur si elle contient l'un des <, >,?, "," Ou/et ajoute un message aux erreurs [: base] .Je up-coché votre réponse comme utile, mais je pense que la question est toujours ouverte :-) –