【问题标题】:Restricting url manipulation to return other user records限制 url 操作以返回其他用户记录
【发布时间】:2011-01-06 20:45:15
【问题描述】:

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

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

本地主机:3000/日志

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

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

寻求解决方案:如何防止手动破解 url 以防止用户查看其他用户记录?

类 LogsController

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 放入“日志”表中

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

【问题讨论】:

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


    【解决方案1】:

    最简单的解决方案是在 show 方法中检查要显示的日志是否确实属于登录用户:

    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

    【讨论】:

    • 非常感谢 ACL 推荐。认证显然不同于授权。仍处于 Rails 的初级阶段,我似乎在 Ruby 语法和 Rails 语法之间读到的所有东西都模糊不清。我已经测试了您的代码,它通过防止 url 操作来工作。操作 url 时,它只显示用户记录。但是,我注意到闪存错误永远不会发生。
    • 抱歉,我现在在修改 URL 时看到“未经授权”。再次感谢您的宝贵时间。
    • 你说得对,我的意思是授权,抱歉混淆了。闪现消息不显示?您需要在您的视图中输出消息(如果存在)的语句。我不知道生成器是否会自动创建它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多