代码:
sort_by = "email" # really params[:sort_by] sort_direction = "asc" # really params[:sort_direction] User.order("#{sort_by} #{sort_direction}") # SELECT "users".* FROM "users" ORDER BY email asc 如果 查询的是
sort_by = "email; DELETE from users; --" User.order("#{sort_by} #{sort_direction}") # SELECT "users".* FROM "users" ORDER BY email; DELETE from users; -- asc
把user全都删除了,order.find(:all, :conditions=>"name='#{name}'") 在conditions里面使用#()是非常不好的做法,这样传入数据库的sql语句不会经过任何的安全过滤。 解决方案: 1. Ryan Bates' method: def index
这样把判断后的结果传回去。 如果不知道sort的列名, 也可以用User.column_names 来代替 %w{email name} 2. 使用Active Record 提供的变量绑定功能对查询语句进行“消毒”,这些邦定的变量会成为你的SQL 语句的一部分。 考虑下面的方法, 他以 id 作为参数查询你的 记录。 参考: http://sunfengcheng.iteye.com/blog/232636 3. 使用占位符 参考: http://blog.waynedeng.com/?p=145@users = User.order(sort_by + " " + direction) end private def sort_by %w{email name}.include?(params[:sort_by]) ? params[:sort_by] : 'name' end def direction %w{asc desc}.include?(params[:direction]) ? params[:direction] : 'asc' end