涉及到一个安全问题,可能有人会利用这个问题进行Hack,加以注意可以避免。

官方说明地址:http://guides.rubyonrails.org/security.html#mass-assignment

Railscasts-china视频地址:http://railscasts-china.com/episodes/mass-assignment?autoplay=true 由Terry Tai进行讲解,个人觉得讲得很不错。学习很多。

这篇文章介绍的方法很不错:http://excid3.com/blog/rails-tip-7-mass-assignment-security/。通过白名单 + params[:user].delete :is_admin 的方式来满足admin对 is_admin这个属性的操作

这里涉及到的文件有:

  1. config/application.rb

    config.active_record.whiltelist_attributes = true 

  2. Model 里的 attr_accessible 与 attr_protected使用
    # 黑名单
    attr_protected :is_admin# 白名单
    attr_accessible :email, :username 

  3. Controller里的 params[:user]使用

问题的产生:

有一个名为User的Model,属性如上所述, 以及相对应的Contorller:UsersContoller。如果把 is_admin属性写在 accessible里,则在填写表单时,在console里把user[email] 改为 user[is_admin],然后填入非0数据,就可以把is_admin的值设置成为 true 。因为在Contoller里我们是这样写的:

File: users_controller.rb

def update    if @user.update_attributes(params[:user])redirect_to @user, notice: 'User was successfully updated.'elserender action: "edit"end
end

这样也就会全盘地接受传过来的值,导致把 is_admin的值也被更改。

解决办法

综合视频以及其他一些博客给出的方法,有以下几种:

  1. 黑名单:在Model里,把 is_admin 用 attr_protected进行保护,不被访问到,即黑名单。坏处是不够灵活,会影响到Model的其他的行为

    class User < ActiveRecord::Baseattr_protected :is_admin
    end 

  2. 白名单:不把is_admin写在attr_accessible里面,这样也不会被访问到
    class User < ActiveRecord::Baseattr_accessible :email, :username
    end  

  3. 在Controller里,对传入的参数进行过滤选择: params[:user].slice(:email, :username),这时Model里面不要把 is_admin 用attr_accessible 来控制。
    class UsersController < ApplicationControllerdef create    @user = User.find(params[id])if @user.update_attributes(user_params)redirect_to @user, notice: 'User was successfully updated.'elserender action: "new"endendprivatedef user_paramsparams[:user].slice(:email, :username)endend

    通过加入一个 user_params 方法,来对传入的参数进行筛选,把 is_admin 排除在外。这种做法好处在于可以灵活定制,但会Repeat Yourself。

    总体来说,个人觉得还是在Controller里进行一个安全过滤比较靠谱。

    关于白名单:在 config/application.rb 里有一行内容为“config.active_record.whiltelist_attributes = true ”,就是说明,在每一个Model里都要显式地声明一个 attr_accessible,否则会出错。如果不想使用这功能,可以把true 设置为 false

转载于:https://www.cnblogs.com/peterzd/archive/2012/11/27/2791552.html

Mass Assignment 防止Hacked相关推荐

  1. [翻译] Ruby Golf

    原文地址:http://rubysource.com/ruby-golf/ Ruby golf is the art of writing code that uses as few characte ...

  2. Python计算机视觉:第九章 图像分割

    第九章 图像分割 9.1 更新用户 9.1.1 编辑表单 9.1.2 编辑失败 9.1.3 编辑成功 9.2 权限限制 9.2.1 必须先登录 9.2.2 用户只能编辑自己的资料 9.2.3 更友好的 ...

  3. laravel 5.1 Model 属性详解

    <?phpnamespace Illuminate\Database\Eloquent;/*** 下面提到某些词的含义:* 1.覆盖: 在继承该类 \Illuminate\Database\El ...

  4. 第四章 Rails 背后的 Ruby

    第四章 Rails 背后的 Ruby 有了第三章中的例子做铺垫,本章将为你介绍一些对 Rails 来说很重要的 Ruby 知识.Ruby 语言的知识点很多,不过对一个 Rails 开发者而言需要掌握的 ...

  5. Rails安全导读【一】

    原文地址:[url]http://guides.rubyonrails.org/security.html[/url] --------翻译分割线 ,翻译的不好,请多多指正-------- Ruby ...

  6. Rails Security (上)

    Lobsiinvok · 2016/03/09 10:20 Author: Lobsiinvok 0x00 前言 Rails是Ruby广泛应用方式之一,在Rails平台上设计出一套独特的MVC开发架构 ...

  7. vue js 对象下的原型_如何使用Vue.js和Pusher创建实时原型反馈应用程序

    vue js 对象下的原型 by Neo Ighodaro 由新Ighodaro 如何使用Vue.js和Pusher创建实时原型反馈应用程序 (How to create a realtime pro ...

  8. Laravel 速记表

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://cheats.jesse-obrien.ca/# Artisan // Displays help for ...

  9. 代码审计[java安全编程]

    SQL注入 介绍 注入攻击的本质,是程序把用户输入的数据当做代码执行.这里有两个关键条件,第一是用户能够控制输入:第二是用户输入的数据被拼接到要执行的代码中从而被执行.sql注入漏洞则是程序将用户输入 ...

最新文章

  1. PHP内核探索之变量(4)- 数组操作
  2. (C++)函数参数传递中的一级指针和二级指针
  3. Hybris ECP(Enterprise Commerce Platform)的调试
  4. catia中sew的用法_CATIA超级副本(PowerCopy)使用方法总结 | 坐倚北风
  5. 深度学习 图像分类_深度学习时代您应该阅读的10篇文章了解图像分类
  6. 登录系统 提示框_实物资产管理软件操作手册(职员和系统用户)
  7. 域名服务器的配置文档,dns域名服务器的配置
  8. 腾讯Techo Park开发者大会召开在即,全球200多位专家共话云计算
  9. STM32F103C8T6用官方bootloader实现IAP升级操作方法
  10. 用 dash_bootstrap_components 为 dash 生成美观的导航栏
  11. ubuntu上安装rsync+sersync
  12. 说下自己看源码的一点经验(Python Web 相关)
  13. Python-flask中数据库连接池DBUtils
  14. 惊爆:普通人也能监听你MSN聊天(转)
  15. 公网地址和私网地址问题
  16. 数据标注员需要专业系统的学习么?
  17. Jetson Xavier NX 套件将系统装到SSD
  18. 机器学习(上)线性回归、多项式回归、标准差、百分位数、数据分布、散点图
  19. phpstyudy端口被占用怎么办
  20. tftp和xinetd服务器的配置

热门文章

  1. 服务器 战地4 无限载入,战地4卡在loading界面无限载入_战地4无限载入解决方法...
  2. 骨传导耳机低频差理所当然?飞利浦A6606表示不服
  3. nvidia jetson agx Xavier can 开机自动运行脚本
  4. 用C#下的Raw Socket编程实现网络封包监视(摘录)
  5. 基于Python的电影数据可视化分析系统 设计报告+答辩PPT+项目源码
  6. 腾讯云乐固客户端加固打包上线流程
  7. 京东淘宝,拼多多三大电商平台竞品分析
  8. android vrs技术,步步高 vivo V1/Y1 智能手机音质测评报告 VRS[vivo signal
  9. 微信小程序 wx.miniProgram.navigateTo和wx.miniProgram.navigateBack无效问题解决
  10. python读书心得体会范文_个人读书心得体会范文五篇