原创作者: hideto   阅读:1524次   评论:0条   更新时间:2011-05-26    
假设我们的users表如下:
create_table "users", :force => true do |t|
  t.column "name",  :string
  t.column "admin", :boolean, :default => false, :null => false
end

看看我们都创建用户的action:
def create
  @user = User.new(params[:user])
  if @user.save
    flash[:notice] = "Successfully registered"
    redirect_to user_path(@user)
  else
    render :action => 'new'
  end
end
end

我们本来不希望新用户注册时设置"admin"为1,而且我们的注册页面只允许用户输入"name"
但是由于我们使用@user = User.new(params[:user])来给@user赋值,Hacker可以这样做来注册一个管理员用户:
curl -d "user[name]=hacker&user[admin]=1" localhost:3000/users

这样Hacker就创建了一个admin用户

解决方法:
我们可以使用attr_protectedxx来限制xxx属性不被赋值
class User < ActiveRecord::Bse
  has_many :comments
  attr_protected :admin
end

attr_protected :admin限制了我们的admin属性不被赋值

但是User的comments仍然可以通过post comment_ids数据来hack,我们可以使用attr_accesiblexx来限制哪些属性可以赋值
class User < ActiveRecord::Base
  has_many :comments
  attr_accesible :name
end

我们限制只有name可以赋值,其他都不能赋值

其实很简单,我们在创建User的create方法里不使用mass assignment即可:
def create
  @user = User.new(:name => params[:user][:name])
end
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics