• [^] # Re: Comment fonctionne le patch 3.2

    Posté par . En réponse à la dépêche Injection SQL sur toutes les versions de Ruby on Rails. Évalué à 6.

    - options = arguments.extract_options!
    + options = if arguments.length > attribute_names.size
    + arguments.extract_options!
    + else
    + {}
    + end
    
    

    Les fonctions find_by_* peuvent recevoir au minimum deux arguments (mais n'en requièrent qu'un au minimum), par exemple find_by_name peut recevoir deux arguments, le nom recherché et des options : find_by_name('Linus', :limit => 1) ou un seul argument : find_by_name('Linus').

    Le problème est que si on ne donne que les options comme argument : find_by_name(:limit => 1) ça fonctionne quand même, du coup le patch n'extrait les options que si il y a les autres arguments passés.

    arguments.length retourne le nombre d'argument donnés (facile).
    attribute_names.size retourne le nombre d'attributs de la recherche (find_by_name => 1, find_by_name_and_karma => 2)

    Donc pour traduire le code : arguments.length > attribute_names.size : si le nombre d'arguments donnés est strictement supérieur au nombre d'attributs de la recherche alors on extrait les options (sinon, pas d'options).

    "Never trust a statistic you haven't faked yourself."