Rails宝典之第二十六式: 防止Hacker入侵

本文介绍了一种在Rails应用中防止用户通过HTTP请求非法修改受保护属性的方法,如管理员权限等敏感信息。通过使用attr_protected和attr_accessible,开发者可以有效地控制哪些属性能够通过HTTP请求进行更改。
假设我们的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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值