2014-11-13 78 views
3

这是什么让来自用户的字符串,并以查询WHERE语句中使用它的最好的和安全的方式。用户查询字符串

比方说,我有一个名为DB模式,其中包含列c1c2。我希望用户能够给我一个像str="c1: value1"str="c1: value1, c2: value2"这样的字符串,以便用它来执行查找(DB.find(str))。当然,我不希望他/她能够执行SQL注入。有没有一种优雅的方式?

回答

3

避免这里最重要的是直接把用户的响应转换成一个where子句。所以不要做像DB.where这样的东西(“c1 = value”)。相反,你可以依靠内置在SQL消毒轨道,通过执行类似

DB.where( “C1 T =?”,value)的

的AR文档是对这个真的清楚。 http://guides.rubyonrails.org/active_record_querying.html#pure-string-conditions

+0

有没有一种优雅的方法来检查多次使用此方法相同的值?就像DB.where(“c1 t =?OR c2 t =?”,值,值)(不重复多次)。 – badnack

+0

用sql no。还有其他方法。谢谢。 – dandlezzz

0

如果您字符串格式是固定的,那么你可以将其转换为Hash,然后可以将其应用到#where条款。

string = "c1: value1, c2: value2" 
hash = Hash[*string.split(/[,:]/).map(&:strip)] 
DB.where(hash)