Hackers Love Mass Assignment
Your site may be at risk! When using mass assignment, you are giving the user complete control over that model and its associations. See how a hacker might use this vulnerability and learn how to stop it in this episode.
你的站点或许面临风险!当你使用mass assignment(传递整个model对象属性参数),你会把整个model及其联系的控制权交给用户。看一下hacker如何利用这来攻击你的站点,并且看看如何阻止其发生。
---
有一个注册页面,可以提交名字。在User这个model中有两个属性 name和admin,admin是一个boolean型的字段。
在users_controller.rb中,这么定义注册的action
def create
@user=User.new(params[:user])
if @user.save
...
else
...
end
end
那么hacker可能通过执行这条语句来直接注册一个admin用户.
curl -d "user[name]=hacker&user[admin]=1" localhost:3000/users
在日志中查看下发生了什么改变:
Parameters:{"user"=>{"hacker", "admin"=>"1"}, "action"=>"create", "controller"=>"users"}
INSERT INTO users ('name', 'admin') VALUES('hacker', 1)
这样就提交了一个admin的user对象。
为了防止这个情况发生,可以在user model里加上
attr_protected :admin
这样就不能从外界提交设置这个字段
在user.rb中,有has_many :comments
hacker可以执行这样的命令:
curl -d "user[name]=hacker&user[admin]=1&user[comment_ids][]=1&user[comment_ids][]=2" localhost:3000/users
admin=1这个已经无法写入数据库了,但是却把comments改成自己的了
用attr_accessible :name
现在就只能用params提交name这一个字段了。
本文转自 fsjoy1983 51CTO博客,原文链接:http://blog.51cto.com/fsjoy/131840,如需转载请自行联系原作者