7
votes

Énoncé préparé des rails avec select_all

Autant que je sache, il devrait être possible de procéder à ce qui suit dans les rails:

ActiveRecord::Base.connection.select_all("SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=$1 AND created<=$2 GROUP BY month ORDER BY month ASC",nil,[['created',1],['created',2]])


0 commentaires

3 Réponses :


-14
votes

Je ne comprends pas si vous essayez d'utiliser des variables, mais oui, il est assez facile de faire avec des variables, vous les avez utilisées à tort

Utilisez-la comme ceci: P>

ActiveRecord::Base.connection.select_all("SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=#{v1} AND created<=#{v2} GROUP BY month ORDER BY month ASC",nil,[['created',1],['created',2]])


2 commentaires

Merci de votre aide. En fait, je veux que 1 $ et 2 $ soit remplacé par [["créé", 1], ["créé", 2]], comme une déclaration de SQL préparée commune. Mais tout ce que je fais, ça ne marche pas. Dans une déclaration de modèle normale des rails comme ... où (), ça marche, mais avec cette base.Connection, je ne peux pas comprendre, comment faire cela ...


Il s'agit d'un exemple de manuel de la manière de créer une vulnérabilité d'injection SQL dans votre application - citation de vos variables avant l'interpolation ou d'utiliser des variables de liaison.



6
votes

Vous devez utiliser sanitize_sql_array dans votre modèle, comme celui-ci: XXX

Cela vous protège des injections SQL.


1 commentaires

Il peut aussi prendre un hachage: sanitize_sql_array (['... où id =: id et tapez (Type)', {id: _, types: _}])



1
votes

Puisque vous n'utilisez pas Named Binds, vous le feriez comme ça. Cela fonctionne dans les rails 4.2.

ActiveRecord::Base.connection.select_all(
  "SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=$1 AND created<=$2 GROUP BY month ORDER BY month ASC",
  nil,
  [[nil,'2016-01-01 12:30'],[nil,'2016-01-01 15:30']]
)


1 commentaires

Est-ce encore une chose? J'obtiens TypeError - TypeError: avec NIILS et Nométhoderror - Méthode non définie CAST_TYPE 'pour ... "En essayant nommé argument. Rails 4.2.10.