comment échapper à une chaîne avant insertion ou mise à jour en Ruby
-
13-10-2019 - |
Question
En ruby ??ActiveRecord ne fournit pas une liaison dynamique pour la mise à jour et insertion sqls, bien sûr que je peux utiliser sql brut, mais qui ont besoin de maintenir la connexion, donc je veux savoir s'il est plus simple d'échapper à la mise à jour ou insérer sql avant d'exécuter comme le code ci-dessous:
ActiveRecord::Base.connection.insert(sql)
Je pense que je peux écrire un code par gsub, mais je sais que si on a une méthode prête à le faire.
La solution
Vous pouvez faire ceci:
ActiveRecord::Base.send(:sanitize_sql,["select * from my_table where description='%s' and id='%s'","mal'formed", 55], "my_table")
Bien sûr, cela signifie que vous avez les params séparément. Je ne sais pas si cela va fonctionner autrement, mais l'essayer.
Autres conseils
Dans Rails> = 3.2.5 les œuvres suivantes pour moi:
evil_input = '"\';%#{}\"foo'
ActiveRecord::Base.connection.quote(evil_input)
=> "'\"'';%\#{}\\\"foo'"
Il est pas vrai clair ce que vous demandez parce que vos pourparlers de titre sur une chaîne échapper avant d'installer ou mettre à jour, puis dans les balises vous parlez de l'injection SQL.
Si vous avez besoin d'avoir ActiveRecord encode / modifier automatiquement le contenu avant l'insertion ou la mise à jour, avez-vous vérifié de Callbacks ActiveRecord? Le rappel before_save
se déclenche lorsque vous faites une mise à jour ou de créer. Si vous souhaitez modifier le contenu avant qu'il ne soit à stocker, qui est un bon endroit pour le faire.
Si vous voulez utiliser des paramètres SQL au lieu d'insérer les variables dans vos déclarations « mise à jour » ou « insert » pour éviter l'injection SQL, puis utilisez de AR fixations variables . Faites défiler jusqu'à la section "Conditions".