2009-11-12 10 views
12

Ruby on Rails, pour les conditions, il est facile de faire des requêtes à l'épreuve par injection SQL:échapper en toute sécurité des chaînes pour des fragments SQL pour les jointures, les limites, sélectionne, et ainsi de suite (pas conditions) on Rails

:conditions => ["title = ?", title] 

où le titre vient de l'extérieur, d'un formulaire Web ou quelque chose comme ça.

Mais si vous utilisez des fragments SQL dans d'autres parties de la requête, comme:

:select => "\"#{title}\" AS title" # I do have something like this in one instance 
:joins => ["LEFT JOIN blah AS blah2 ON blah2.title = \"#{title}\""] 

Y at-il un moyen d'échapper correctement ces chaînes?

Répondre

22

Généralement dans Rails, les jointures sont effectuées sous la forme d'un symbole (ou d'un hachage pour les jointures de second ordre) représentant une jointure d'ID et vous utilisez les conditions pour le filtrer. Si vous devez le faire comme indiqué, vous pouvez utiliser sanitize_sql_array d'ActiveRecord pour nettoyer une chaîne SQL, comme ceci:

sanitize_sql_array(["LEFT JOIN blah AS blah2 ON blah2.title = ?", @blah.title])