2012-03-15 1 views
3

Question à propos de la magie de Rails:Comment Rails affecte-t-il les colonnes d'enregistrement actives par défaut?

Je jouais avec IRB et le corrompu? méthode, alors je viens de faire ce qui suit:

>> User.first.attributes.collect { |column, value| [column, value.tainted?] } 
=> [["phone", true], ["state", false], ["persistence_token", true], ["last_login_ip", true], ["country", true], ["login_count", false], ["last_request_at", false], ["id", false], ["forname", true], ["current_login_at", false], ["name", true]] 

Est-ce que quelqu'un sait pourquoi certains des params sont entachées et certains ne sont pas? Et s'il y a un moyen de choisir quelle colonne devrait être corrompue?

EDIT:

Merci pour les réponses.

@sgtFloyd: J'ai juste essayé de mettre à jour manuellement le pays. et voici ce qui se passe:

>> u = User.first 
>> u.country = "USA" 
=> "USA" 
>> u.country.tainted? 
=> false 
>> u.save 
=> true 
>> u.country.tainted? 
=> false 
>> u.reload 
>> u.country.tainted? 
=> true 
>> u.country.class 
=> String # it's also string in the database 

EDIT 2:

j'ai enlevé tout à l'intérieur du modèle de l'utilisateur, et quelques colonnes de chaîne ne semblent pas entachées alors que certains ne ...

Merci une lot!

+0

pourriez-vous ajouter la valeur elle-même? est-il faux quand il n'y a pas de valeur, vs vrai quand il y a une valeur? – DGM

+0

Quel type de données est votre champ emailing? Tous les autres qui ont altéré? == faux sont numériques (y compris les dates) alors que les altérés sont des chaînes. Cela pourrait être quelque chose sur la façon dont ActiveRecord gère les données de chaîne, peut-être? –

+0

Oui, vrai seulement la chaîne est corrompue, mais pas toutes (certaines de mes colonnes de chaîne ne sont pas corrompues)! C'est pourquoi c'est bizarre ... – jrichardlai

Répondre

2

taint et tainted? sont des méthodes de la classe Object de Ruby. Si vous cherchez à trouver quels objets ont été modifiés dans votre application Rails, il se peut que vous cherchiez modifié?

@customer.email = '[email protected]' 
do_something if @customer.email_changed? 
+0

Merci pour le commentaire, mais je suis seulement intéressé de voir pourquoi certains attributs sont entachés et d'autres pas. – jrichardlai

2

AFAIK, Rails ne fait pas usage de souillure, il garde la trace des changements, et les conditions de html_safe, mais je n'ai vu aucune mention de l'odeur. Les docs de ruby ​​pour l'altération disent qu'il est censé être corrompu quand il provient de sources externes, je suppose que cela a quelque chose à voir avec les bibliothèques sql utilisées. Mais sans voir cette bibliothèque elle-même, je ne peux pas deviner pourquoi certains sont corrompus et d'autres non.

L'exécution de ce code sur mes projets est fausse. Cela dépend probablement de la version de ruby ​​/ rails que vous utilisez et, comme elle n'est pas définie par des rails, est probablement impropre à dépendre.

+0

Je crois qu'il existe un plugin de sécurité qui repose sur l'altération. – steve

2

De Programming Ruby

Tout objet dérivé de Ruby une source externe (par exemple, une chaîne lecture d'un fichier ou une variable d'environnement) est automatiquement marqué comme étant contaminé. Si votre programme utilise un objet contaminé à un nouvel objet dériver, puis ce nouvel objet sera également ... viciée

De votre exemple, des colonnes comme last_login_at, password_salt et created_at sont créés et traités exclusivement en interne, sans en utilisant n'importe quelle entrée de l'utilisateur. phone, email, country etc. sont dérivés de l'entrée de l'utilisateur, donc ils sont intrinsèquement indignes de confiance.

+0

Merci pour la réponse, j'ai ajouté un autre exemple dans mon message, je ne comprends pas pourquoi si les données proviennent de mon entrée, il est encore entaché. – jrichardlai

Questions connexes