Rails, comment assainir SQL dans find_by_sql
Est-il un moyen de désinfecter sql dans les rails de la méthode find_by_sql
?
J'ai essayé cette solution:
Ruby on Rails: Comment désinfecter une chaîne de caractères pour SQL lorsque vous n'utilisez pas le trouver?
Mais il ne parvient pas à
Model.execute_sql("Update users set active = 0 where id = 2")
Il renvoie une erreur, mais le code sql est exécutée et que l'utilisateur ayant l'ID 2 a maintenant un compte désactivé.
Simple find_by_sql
aussi ne fonctionne pas:
Model.find_by_sql("UPDATE user set active = 0 where id = 1")
# => code executed, user with id 1 have now ban
Edit:
Eh bien, mon client a demandé de faire de cette fonction (select en sql) dans le panneau admin de faire quelques requête complexe(jointures, des conditions spéciales, etc). Donc j'ai vraiment envie de find_by_sql.
Deuxième Edit:
Je veux réaliser que "le mal" code SQL ne sera pas exécutée.
Dans le panneau d'administration, vous pouvez taper query -> Update users set admin = true where id = 232
et je veux bloquer toute mise à JOUR /SUPPRIMER /MODIFIER des commandes SQL.
Je veux juste savoir, qu'ici, vous ne pouvez SÉLECTIONNER.
Après quelques tentatives pour conclure, je sanitize_sql_array
malheureusement, ne le faites pas.
Est-il un moyen de le faire dans les Rails??
Désolé pour la confusion..
source d'informationauteur nothing-special-here
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Vous pouvez l'enregistrer dans une variable et de l'utiliser pour vos besoins.
J'ai fait un petit extrait de ce que vous pouvez mettre dans les initialiseurs.
Droit maintenant, vous pouvez échapper à votre requête:
Et vous pouvez appeler la requête de la façon que vous voulez:
Un peu plus d'usage général:
Permet de l'appeler comme vous le feriez type dans une clause where, sans les crochets, et en utilisant la matrice de style ? ou de hachage de style interpolations.
De l'utilisateur.find_by_sql(["SELECT * from users where (nom = ?)", params])
Trouvé à http://blog.endpoint.com/2012/10/dont-sleep-on-rails-3-sql-injection.html
Bien que cet exemple est pour INSÉRER une requête, on peut utiliser une approche similaire pour les requêtes de mise à JOUR. Raw SQL d'insertion en bloc:
Ici est la référence à sanitize_sql_array méthode dans ActiveRecord::Baseil génère la bonne chaîne de requête par s'échapper les apostrophes dans les cordes. Par exemple, le punch_line "de Ne pas les laisser vous vers le bas" devient "Don\'t laisser vous vers le bas".