PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Injection SQL Rails 5

Utilisation de quote est sécurisé. J'ai lu les réponses sur la page que vous avez liée , et je ne vois personne dire que quote est peu sûr. Je vois votre question sur l'utilisation de "guillemets". Oui, si vous mettez juste des guillemets autour d'une chaîne, ce n'est pas sûr, par exemple :

q = "SELECT * FROM users where email = '#{params[:email]}'"

Mais en utilisant quote (la méthode) est bonne :

q = "SELECT * FROM users where email = #{connection.quote(params[:email])}"

Vous pourriez jouer dans la console et faire de votre mieux pour la casser, mais je ne pense pas que vous en serez capable :

2.3.3 :003 > ActiveRecord::Base.connection.quote("f''oo")                                                                              
 => "'f''''oo'"

Si vous réussissez, je suis sûr que l'équipe Rails aimerait le savoir (en privé) ! Mais comme vous pouvez le voir, la quote La méthode fait plus que coller une citation au début et à la fin.

De plus, puisque vous dites que vous recherchez une citation faisant autorité, les commentaires dans le code source lui-même suggèrent que la citation des entrées de l'utilisateur est l'objectif visé par ces fonctions :

https:/ /github.com/rails/rails/blob/2471e6391dfe71cfbb8621bdf573729d961d3209/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb#L6-L13

# Quotes the column value to help prevent
# {SQL injection attacks}[http://en.wikipedia.org/wiki/SQL_injection].
def quote(value)

https:/ /github.com/rails/rails/blob/0f1d0b1b5254e3678abaabbebb3362a100c10262/activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb#L17-L20

# Quotes strings for use in SQL input.
def quote_string(s) #:nodoc:

(Notez que je montre quote_string pour le commentaire, mais vous devriez probablement utiliser quote , qui essaie de déterminer le type de données et de faire quelque chose de approprié.)

Au fait, voici une question similaire à la vôtre, avec une réponse de ma part en 2014, et quelques alternatives aussi :Comment exécuter une mise à jour brute sql avec une liaison dynamique dans les rails