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.

Était-ce utile?

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".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top