安全问题一,关于表单映射model属性传递(mass assignment)方面的疑虑?

bs2004 发布于 2012/03/31 00:41
阅读 1K+
收藏 1

引子:

       今天(现在零点,实际应该是昨天了)中午看一点ruby on rails方面的东西,准确说,ruby只是刚安装了敲了个puts、def,on rails则看没见到影子了。

       说重点,巧了看到mass assignment问题(传递整个model对象属性参数),问题描述地址:http://fsjoy.blog.51cto.com/318484/131840 , 为了避免让大家多点鼠标,将问题的重点描述引用如下:

 

描述:

-----------------描述  Start----------------------------------------------

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用户。 
-------------------------描述 End-----------------------------------------------
 
JAVA开发中的实际情形:
平常对这个问题没有注意过,下面考虑了几种开发中可能遇到的情形:
1,<jsp:useBean
     即jsp的request表单数据映射为javabean的属性,比如Model中有属性A但表单中无,但是前台可以伪造并提交(虽然是概率事件,不过安全问题需要考虑概率事件),此情形一;
2,Struts的ActionForm,与上面1大同小异,不同的是ActionForm需要xml配置(ActionForm用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的。因此应保证ActionForm的参数,与表单域的名字相同。)
3,其他情况应都是model映射的变种,归此第三种情形。
 
Ruby on Rails的解决方案:
 参见上面问题描述链接中,即( railscast)讲述到的解决方案(使用ruby的童鞋多多注意):
为了防止这个情况发生,可以在user model里加上

attr_protected :admin

这样就不能从外界提交设置这个字段

在user.rb中,有has_many :comments

 

jfinal及日常开发中的解决方案?

       正因为提倡敏捷开发,所以个人以为jfinal不得不考虑这方面的问题,今天正好遇到这个问题,故此提出来,大家多讨论讨论实际遇到情景下的解决方案。

      恐怕我们大多都是没有考虑,呵呵,也可能公司的项目,即使考虑到了,也懒的麻烦去解决这概率小缺陷吧,大家多提供宝贵意见。

 

附一个隐蔽的问题:OSC的提问为什么没有填关键字的地方(提此问题是因为OSC的提问做的很不错),隐蔽,你能看到吗,O(∩_∩)O~

加载中
0
JFinal
JFinal
很感谢您提出的这个有深度的问题,JFinal早就针对于 mass assignment做了简洁且安全的设计,com.jfinal.plugin.activerecord包下的  Model 与 Record类中提供了 keep(...)与remove(...)系列方法可供使用,这两类方法不仅可以轻松应对 mass assignment攻击,而且还可以在保存model时有选择性的指定属性,很是方便。keep(...)方法的作用是仅保留指定的属性删除其它所有属性,remove(...)方法的作用是仅移除指定的属性保留其它所有属性。 当需要保存的属性比较少时可以使用keep(...),多时可以使用remove(...)。 mass assignment这个问题我最初是在用rails开发项目时想到的, mass assignment  这个名词我是今早看到这位童鞋的提问才知道的,非常感谢你 
bs2004
bs2004
"途径是通过执行SQL",这个我想错了啊。实际上是对不同权限的分配定义不同的接口,比如新增普通用户接口(remove某些属性),高级用户接口(不remove某些属性)。 多谢解答。 期待你的文章。另外问下OSC回复里的@xxx是怎么弄的?
JFinal
JFinal
@bs2004 : 被keep或remove了,实质就是按需把key/value从map中移除了,需不需要给不在model中的字段赋值看开发者的需要了。
JFinal
JFinal
@bs2004 : JFinal的方方面面,甚至连每一个方法的设计都是经过仔细思考精心设计的,所以要写这样一篇文章出来需要费很多的时间。不过我现在正起草一篇JFinal设计原则方面的博文,从总体上去描述这种极简主义设计思想。
JFinal
JFinal
@bs2004 : 没错,就是这样用的 :)
bs2004
bs2004
对于jfinal方面的特别考虑的设计或思想,还请多发几个博文分享一下啊。
下一页
0
ddatsh
ddatsh
就是从上次GITHUB 被XX 分析的吧
bs2004
bs2004
对的,你说我想起来了正是看了好像是infoq上github被XX的文章,搜索了下mass assignment。
0
红薯
红薯
回答隐藏问题:OSC的提问关键字就是关联的软件,非软件类的关键字我们的编辑会负责填写:)
bs2004
bs2004
红薯不仅很忙,也眼厉啊(这样都及时看到了),敬佩。
散装海盗
散装海盗
编辑很忙啊
返回顶部
顶部