Rails 3 activerecord order - 正确的sql注入工作是什么?

2024-03-11

假设我有一个用户列表页面,您可以按不同的列进行排序,当单击“电子邮件”时,它将传递 sort_by=电子邮件 排序方向=asc 或 desc

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

sort_by = "email; DELETE from users; --"
User.order("#{sort_by} #{sort_direction}")
# SELECT "users".* FROM "users" ORDER BY email; DELETE from users; -- asc

现在我们没有更多的用户了:(

我可以手动构建有效 sort_by 的白名单并将 params[:sort_by] 与其进行比较,但希望有一些内置方法来处理此类事情


瑞安·贝茨的方法:

在你的控制器中:

def index
  @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

本质上,您正在创建一个白名单,但它很容易做到并且不易受到注入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 3 activerecord order - 正确的sql注入工作是什么? 的相关文章

随机推荐