原创作者: hideto
阅读:1531次
评论:0条
更新时间:2011-05-26
假设我们的users表如下:
看看我们都创建用户的action:
我们本来不希望新用户注册时设置"admin"为1,而且我们的注册页面只允许用户输入"name"
但是由于我们使用@user = User.new(params[:user])来给@user赋值,Hacker可以这样做来注册一个管理员用户:
这样Hacker就创建了一个admin用户
解决方法:
我们可以使用attr_protectedxx来限制xxx属性不被赋值
attr_protected :admin限制了我们的admin属性不被赋值
但是User的comments仍然可以通过post comment_ids数据来hack,我们可以使用attr_accesiblexx来限制哪些属性可以赋值
我们限制只有name可以赋值,其他都不能赋值
其实很简单,我们在创建User的create方法里不使用mass assignment即可:
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 条 请登录后发表评论