假设我们的users表如下:
[code]
create_table "users", :force => true do |t|
t.column "name", :string
t.column "admin", :boolean, :default => false, :null => false
end
[/code]
看看我们都创建用户的action:
[code]
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
[/code]
我们本来不希望新用户注册时设置"admin"为1,而且我们的注册页面只允许用户输入"name"
但是由于我们使用@user = User.new(params[:user])来给@user赋值,Hacker可以这样做来注册一个管理员用户:
[code]
curl -d "user[name]=hacker&user[admin]=1" localhost:3000/users
[/code]
这样Hacker就创建了一个admin用户
解决方法:
我们可以使用attr_protected :xxx来限制xxx属性不被赋值
[code]
class User < ActiveRecord::Bse
has_many :comments
attr_protected :admin
end
[/code]
attr_protected :admin限制了我们的admin属性不被赋值
但是User的comments仍然可以通过post comment_ids数据来hack,我们可以使用attr_accesible :xxx来限制哪些属性可以赋值
[code]
class User < ActiveRecord::Base
has_many :comments
attr_accesible :name
end
[/code]
我们限制只有name可以赋值,其他都不能赋值
其实很简单,我们在创建User的create方法里不使用mass assignment即可:
[code]
def create
@user = User.new(:name => params[:user][:name])
end
[/code]
[code]
create_table "users", :force => true do |t|
t.column "name", :string
t.column "admin", :boolean, :default => false, :null => false
end
[/code]
看看我们都创建用户的action:
[code]
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
[/code]
我们本来不希望新用户注册时设置"admin"为1,而且我们的注册页面只允许用户输入"name"
但是由于我们使用@user = User.new(params[:user])来给@user赋值,Hacker可以这样做来注册一个管理员用户:
[code]
curl -d "user[name]=hacker&user[admin]=1" localhost:3000/users
[/code]
这样Hacker就创建了一个admin用户
解决方法:
我们可以使用attr_protected :xxx来限制xxx属性不被赋值
[code]
class User < ActiveRecord::Bse
has_many :comments
attr_protected :admin
end
[/code]
attr_protected :admin限制了我们的admin属性不被赋值
但是User的comments仍然可以通过post comment_ids数据来hack,我们可以使用attr_accesible :xxx来限制哪些属性可以赋值
[code]
class User < ActiveRecord::Base
has_many :comments
attr_accesible :name
end
[/code]
我们限制只有name可以赋值,其他都不能赋值
其实很简单,我们在创建User的create方法里不使用mass assignment即可:
[code]
def create
@user = User.new(:name => params[:user][:name])
end
[/code]
本文介绍了一种在Rails应用中防止用户通过HTTP请求非法修改受保护属性的方法,如管理员权限等敏感信息。通过使用attr_protected和attr_accessible,开发者可以有效地控制哪些属性能够通过HTTP请求进行更改。
822

被折叠的 条评论
为什么被折叠?



