限制url操作以返回其他用户记录

时间:2011-01-06 12:32:07

标签: ruby-on-rails security ruby-on-rails-3

我刚刚开始使用Rails 3.我使用Rails 3中的脚手架在名为“Logs”的表上生成了以下代码。

下面的'index'函数仅提供与current_user.id相关联的记录(来自存储在会话表中的会话)。用户记录仅显示以user = 3登录的以下路由(请参阅下面的索引代码)

  

本地主机:3000 /日志

问题:作为用户,我可以通过手动编辑网址来查看不是我的记录(用户= 3)的记录,以显示任何其他记录:

  

localhost:3000 / logs / 5'这是由user.id = 2'

输入的

寻求解决方案:如何防止手动黑客攻击以防止用户查看其他用户记录?

  

类LogsController< ApplicationController中

     

before_filter:login_required

def index 
  @logs = Log.where(:user_id => current_user)
  respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @logs }
end

请忽略以下创建功能中缺少的新功能。下面的代码仅用于演示如何将user_id放入“Logs”表

def create
 @log = Log.new(params[:log])
 @log.user_id = current_user.id
  respond_to do |format|
  if @log.save
    format.html { redirect_to(@log)}
    format.xml  { render :xml => @log, :status => :created, :location => @log }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @log.errors, :status => :unprocessable_entity }
  end
end

1 个答案:

答案 0 :(得分:4)

最简单的解决方案是检查show方法,如果Log to display真的属于登录用户:

def show
  @log = Log.find(params[:id])
  unless @log.user_id == current_user.id
    flash[:error] = "unauthorized"
    redirect_to :index
  end
end

但是您很快就会有更多想要限制访问的内容,因此您应该寻找一个允许以声明方式定义访问权限的身份验证插件。也许这一个:https://github.com/be9/acl9