我刚刚开始使用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
答案 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