0

我想在某个列表中找到所有具有通用名称或内部名称的小部件query_list。我可以

# Consider query_list = ["a","b","c"]
qlist = '(' + query_list.join(",") + ')'
# this makes 
widgets = Widget.find_by_sql("SELECT * FROM widgets 
     WHERE common_name IN #{qlist} OR internal_name IN #{qlist}")

现在我有几个问题:

  1. 关于 SQL 注入攻击,上述 find_by_sql 是否安全?好像可以把危险的东西放进去query_list
    • 怎么写.find_by_sql(["SELECT * FROM widgets WHERE common_name IN ? OR internal_name IN ?", ["a","b","c"], ["a","b","c"] ])
    • 如果它不安全,我们可以让它安全吗?
  2. 如果没有必要,我宁愿不写原始 sql。我知道我们可以在 中写入AND条件find,如在 中.find(:conditions=>{:internal_name => ['a','b','c'], :common_name => ['a','b','c']})。我们也可以OR用 find 写条件吗?
  3. 怎么用where?这与使用有什么不同find
4

1 回答 1

0

带有占位符的版本可以安全地防止 SQL 注入,只要您不介意用户能够选择任意小部件,我假设您不会。根据您拥有的 Rails 版本,您可以避免使用链式编写原始 SQL;请参阅Ruby on Rails 3 howto make 'OR' 条件

请注意,如果列表为空或 is ,您的代码原样或使用占位符将导致数据库错误[nil],因此最好在进行查询之前测试 query_list.first 是否存在。

于 2012-11-14T05:10:39.047 回答