2010-11-24 34 views
2

Supposons que j'ai une zone de recherche sur une page dans une application Rails 3 où vous pouvez rechercher un client par nom d'entreprise ou par ville. Dans la méthode d'index de mon contrôleur, je fais ceci:Est-ce que cette recherche de Rails 3 est vulnérable à l'injection SQL?

if params[:search] 
    @clients = Client.where("clients.business_name LIKE :business_name OR clients.city = :city", :business_name => "%#{params[:search]}%", :city => params[:search]) 

Ces valeurs de hachage sont remplacées dans le SQL et entourées de guillemets. Si mon entrée dans la zone de recherche inclut des guillemets ou d'autres caractères dangereux, je les vois être échappés dans le journal de développement, comme:

... WHERE (clients.business_name LIKE '% Something \' DROP TABLE Foo% » ...

Ou

...WHERE... OR clients.city = 'Something OR 1=1') 

Ainsi, depuis le OR 1=1 est à l'intérieur des citations Rails ajoute, il produit tout simplement pas de match pour le nom de la ville, et depuis la citation dans la tentative DROP TABLE est échappé, il produit également aucune correspondance pour le nom commercial

Ceci n'utilise pas les instructions préparées réelles, où la requête est d'abord envoyée à la base de données sans que les valeurs de recherche ne soient renseignées. Ensuite, les valeurs de recherche sont envoyées à la base de données. mais Rails ne le fait pas; Je pense que c'est parce que ce n'est pas disponible dans toutes les bases de données et les implémentations varient.

Est-ce ouvert à l'injection SQL d'une certaine manière? Je ne le vois pas, mais encore une fois, il n'utilise pas d'instructions préparées, donc je me demande. S'il y a une vulnérabilité, comment pourrais-je le faire de manière plus sûre?

Répondre

5

Non, il n'y a pas de vulnérabilité d'injection SQL ici. ActiveRecord appellera connection.quote sur les valeurs du hachage que vous avez passé en tant que deuxième paramètre à where, de sorte que vous êtes en sécurité.

Le seul point d'injection SQL potentiel que je pourrais penser serait s'il y avait un bogue non découvert dans connection.quote, ce qui est assez improbable.

+0

Depuis que beaucoup de gens ont vu cette question et personne n'a signalé une vulnérabilité, j'accepte cette réponse. Merci! Bien sûr, si quelqu'un en trouve un, je vais devoir le changer. –