2014-04-03 123 views
0

这正常工作,并返回正确的结果:Rails的LIKE查询不工作

query = params[:query].downcase 
users = User.find(:all, :conditions => ['username LIKE ?', "%#{query}%"]) 

不过,我认为这是不安全的,因为它是开放的SQL注入攻击?

所以我试图做这样的:

users = User.all(:conditions => ["username LIKE ?", query]) 

甚至

users = User.where("username LIKE ?", query) 

但既不是那些2返回任何结果。

这样做的正确方法是什么?

编辑: 这工作:

users = User.where("username LIKE ?", "%#{query}%") 

但根据Rails的文档:

enter image description here

+0

你上次编辑的例子没有做红色图像块中的例子。注意他们没有传入数组来清理查询。 –

+0

@ Nighthawk441不知道你的意思..我看不出我在做什么和他们在做什么之间的区别。 – Snowman

+0

@moby不同的是,你在所有的三个例子中都使用了'?',而Rails警告不使用'?'。 –

回答

3

你错过了你的替代尝试百分比符号在查询:

query = "%thing_to_find%" 
users = User.all(:conditions => ["username LIKE ?", query]) 

- 或 -

query = "%thing_to_find%" 
users = User.where("username LIKE ?", query) 

但随着中说,你的第一个例子是SQL注入安全。实际上你的三个例子都是AOK!

+0

这个百分比是多少?另外,我是否正确地认为我的初始尝试对SQL注入攻击是开放的,还是安全的? – Snowman

+0

百分号指示SQL执行通配符匹配 –

+0

请注意,为了保证精确的匹配,你应该转义该字符串;也就是说,如果'thing_to_find'为'“%”',你的查询将变成'username LIKE'%%%'',在PostgreSQL中的fe匹配一切 – mdesantis