Rails安全性:如果不是current_user,则重定向

时间:2010-01-27 22:04:18

标签: ruby-on-rails security

我一直在使用authlogic,它的效果非常好。我注意到的一件事是,作为黑客,我可以轻松输入这个地址:

本地主机:: 3000 /用户/ a_user_that_is_not_me /编辑

由于编辑表单中的表单是针对@user设置为current_user并且需要真实性令牌,即使我尝试为其他用户输入详细信息,我最终也会更改自己的帐户而不是其他用户。

这很好,很好,但我希望这些黑客能够在看到表单之前重定向。

我在users_controller中尝试了这个:

def edit
  if admin?
    @user = params[:user]
  elsif User.find_by_username(params[:id]) != current_user
    @user = current_user
    @not_user = User.find_by_username(params[:id])
    redirect_to user_path(@not_user)
  else
    @user = current_user
  end
end

如果我输入一个包含其他用户名的地址,但重定向有效,但在尝试访问当前用户的编辑页面时出现404错误。

为什么这不起作用的任何想法?

2 个答案:

答案 0 :(得分:3)

如果您要做很​​多这样的事情,请查看authorization-san之类的授权插件。

授权与身份验证的不同之处在于身份验证正在登录,但授权与经过身份验证(或未经身份验证)的用户执行操作的权限相关。

使用authentication-san,您可以在控制器中使用以下代码定义此规则:

# this assumes you've got some way to set @user to the user you're looking up, 
# e.g. in a before_filter 
allow_access(:authenticated, :only => [:edit, :update]) { current_user == @user }

答案 1 :(得分:1)

如果当前用户是管理员,您似乎正在为字符串分配@user。这更简单(不易出错):

def edit
  u = User.find_by_username!(params[:id])
  if admin? or current_user.username == params[:id]
    @user = u
  else
    redirect_to user_path(u)
  end
end

此外,您不想使用find_by_username!(结尾处),以便在找不到用户时呈现404页面吗?我不确定你现在如何获得404页面......