当前位置: 首页 > 图文教程 > Java技术 > Web框架 > Web框架:Struts中的ActionForm 作为防火墙
当请求提交时,ActionServlet 使用一个自动组装机制来从请求参数中设置请求的
ActionForm属性。这使得你可以通过控制哪个ActionForm 属性被暴露的方式来控制哪个
请求参数是可接受的。这也意味着如果你的ActionForm 的粗心设计,你可能失去控制哪个
参数可以接受的能力。ActionForm 一定不能包含看起来像是一个JavaBean 属性,但却不
能从HTTP 请求设置的属性方法。
设计ActionForm时你应该当心的是它的自动化组装机制。自动化机制自己是乐于根据请求
来设置ActionForm的公共属性的,而不管它们是否是来自于HTML表单。所以,如果你要
将一个bean重用为ActionForm,bean上的一些公共属性—以及它的超类—就可从HTTP 请
求中直接设置。因为引用是可以被嵌套和链接的,某些作为成员属性的bean也被暴露,连
同其超类和一些成员属性。如果这些bean中的某些可以在系统状态中立即改变,那么一个
欺骗就可以影响到状态改变—即便那不是一个有意的用法。
如果你从头创建一个ActionForm,并按其原本的意图,你就完全没有必要担心自动组装。
但某些开发人员喜欢将业务对象置于ActionForm中以便它们可以从请求中通过值来传递。
如果这样,某些看起来像JavaBean 属性的方法, 如果它们接受一个 String 值,就可能被从
一个例子是ActionServlet的上载缓冲区大小。在 Struts 1.0中,ActionServlet 被暴露为一
个ActionForm成员属性。这意味着在 Struts 1.0, 你可以从HTTP请求中来调用
ActionServlet.setBufferSize。幸运的是,这并没什么影响,因为ActionServlet 仅在启动初
始化时使用这个值。然而,如果 servlet 是在运行时引用它,一个欺骗可以将它设置为0,
来创建一个拒绝服务攻击。
使用ActionForm这样的可以影响系统状态的bean,或者一个ActionForm的一部分, 就像直
接传递输入字段到一个外壳脚本。这就如同不能区分在误导的人群中哪些是狂欢纵乐的聪
明人一样。
ActionForm 就像一个防火墙系统中的DMZ:它使你在数据被允许传递到应用的其它部分
之前必须检查数据。
评论 (0) All