请问struts2 安全漏洞测试不安全是吗?

403拒绝访问
本缓存服务器管理员:
Via:xiangdianxin84:4 (Cdn Cache Server V2.0)
Generated Sat, 30 Jul :19 GMT by
(Cdn Cache Server V2.0)Struts2的action是否为线程安全?Struts1的区别?
当第一次*.do请求过来时,在内存中的actionmapping中找到相对应的action,然后new出这个action放在缓存中,当第二次一样的请求过来时,还是找这个action,所以对于struts1来说,action是单实例的
,只有一个,如果在action中定义变量,就要非常小心了,因为并发问题,可能带来灾难性的后果,也不是不可以,我们可以加锁达到同步,只是在性能上就要折衷了。
每次请求过来都会new一个新的action , 所以说struts2的action是线程安全的 ,
但同时也带来一个问题,每次都new一个action ,这样action的实例太多 , 在性能方面还是存在一定的缺陷的。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Struts2安全漏洞频出 ,多因Apache官方代码编撰不严谨_老软件工程师的自白:编程平庸也可以成为优秀软件工程师_请问一个STL中stack的遍历__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
Struts2安全漏洞频出 ,多因Apache官方代码编撰不严谨
老软件工程师的自白:编程平庸也可以成为优秀软件工程师
请问一个STL中stack的遍历
Struts2安全漏洞频出 ,多因Apache官方代码编撰不严谨
Struts2安全漏洞频出 ,多因Apache官方代码编写不严谨
日前,Struts2再次爆出安全漏洞,主要影响国内电商、银行、运营商等诸多大型网站和为数众多的政府网站。国外安全研究人员日前发现,Apache Struts2在处理CVE-的漏洞补丁中存在缺陷,会被轻易绕过,可导致任意命令执行。黑客进而能够窃取到网站数据,或者对网站进行DDoS攻击。
360网站卫士盘点了近年来曝出的高危Struts2漏洞,并分析了Struts2为什么屡屡出现重大安全漏洞。4年前就存在Struts2代码执行问题
Struts2漏洞,这里主要指的是J2EE开源框架struts2出现的命令执行漏洞,危害巨大,可导致远程执行任意系统命令,进而获取系统控制权,数据库控制权,导致信息泄露。所有使用struts2框架开发的系统都受影响。
Struts2的代码执行问题最早要追溯到2010年,当时来自Google安全Team的Meder Kydyraliev发现可以通过用unicde编码的形式绕过参数拦截器对特殊字符“#”的过滤,造成代码执行问题,官方漏洞编号S2-003,我们可以在struts2官方的漏洞公告中看到如下文字,如图官方给出了利用代码,但是对却忽视了这个漏洞的威力,因为官方看到Meder Kydyraliev给出的代码以为就是一个简单的bypass,没有意识到利用此漏洞可以远程执行任意命令,于是随意修改了一下过滤规则便草草了之了。当时apache官方是这样修补的,他们用正则将含有“\u0023”的请求全部过滤掉。这样的修复根本没有起到作用,因为“\u0023”在传递过程中被转义为“\\u0023”所以正则根本没匹配上,悲剧的是他们没有意识到这个问题。
好在官方终于发现了ognl表达式的威力,ognl可以调用java静态方法,struts2本身就是一个命令执行漏洞,于是他们修改了一些参数进而限制执行java静态方法。经过研究发现,他们修改了OGNL上下文中一些命名空间中的属性,比如将#_memberAccess.allowStaticMethodAccess设置为true,#context["xwork.MethodAccessor.denyMethodExecution"]设置为false。但是通过unicde编码绕过过滤规则的问题依然存在。他们以为这样便万事大吉了。漏洞频繁出现
可能是因为apache冷落了Google安全Team,没过多久,Meder Kydyraliev大神便发飙了,这次他构造了一个可以远程执行任意命令的利用代码提交给apache官方,因为之前unicode编码绕过的问题一直存在,所以还是S2-003的bypass方式,只不过这次他给出了利用ONGL调用java静态函数执行系统命令的方法,并且在他的blog当中给出了详细的分析,如图所示:所以S2-003的修复宣告失败,此漏洞编号S2-005,CVE-。但是官方的修复却很简陋,他们重新修改了正则,封堵了Meder Kydyraliev的利用,但是始终没有从根本上解决问题,他们没有意识OGNL表达式用八进制编码依然是可以执行的,比如”\u0023”换成八进制的“\43”,再次绕过。
这次,apache官方终于意识到问题的严重性,更加严谨的改写了正则,过滤掉了出现\, @等字符的请求内容,官方修改的正则表达式,如图所示f3.png
但是struts2的问题依然存在,不知道过了多久大概是2011年,Meder Kydyraliev再次发飙(CVE-),他提出新的利用思路,借助action实例中的私有变量的set方法执行OGNL调用java静态方法执行任意命令。关于这个问题,其实还牵扯出好多web容器的特性,但是危害依然巨大,此漏洞编号S2-009,CVE-,而官方依然是通过正则过滤的方式来修复此问题,官方修复如图所示f4.png
此后还出现过S2-013利用struts2标签执行ognl的方式,但是这些漏洞都相对鸡肋,影响范围也就大打折扣了。
事实上struts2框架底层是利用OGNL表达式来实现的,然而OGNL表达式的功能过于强大,导致可以直接调用java静态方法。但是官方为了防止在OGNL表达式中直接调用java静态方法,它在OGNL上下文中内置了几个命名对象。例如,#_memberAccess["allowStaticMethodAccess"]默认被设置为false,#context["xwork.MethodAccessor.denyMethodExecution"]默认被设置为true。
之前的几个漏洞使官方意识到他们做的很多限制都白费,比如上面提到的这几个属性的值可以利用执行OGNL进行修改,我们不难看出上面提到的这两个漏洞都会先设置这两个属性,然后调用java静态方法。
一直到2013年,在S2-013被爆出之后,#_memberAccess["allowStaticMethodAccess"]的属性,使它没有权限被修改。这样看似从根本上解决了问题。但是他们忘记了利用java反射类来访问私有成员变量这种猥琐的方法。关于反射类这里顺带说一下,在这之前还出现过例如S2-008命令执行,不过这其实是Struts2开发模式的一个特性,严格来讲不能算是漏洞,只不过在他的处理逻辑当中用户可以控制执行OGNL,但是默认struts2的开发模式是关闭的,所以此漏洞很鸡肋。但值得一提的是一直到2014年pwntesting的一篇分析文章中给出S2-008的利用方式,真正利用java反射类修改前面那两个属性的奇技淫巧。
另外,还有另一种方法更加干脆,就是java.lang.ProcessBuilder这个类,随便new一个实例然后调用start()方法,便达到命令执行的目的。所以apache改了半天有白忙活了。
关于比较火的struts2命令执行漏洞,在就是去年7月份爆出的S2-016了。关于这个漏洞,其实是DefaultActionMapper类支持以"action:"、"redirect:"、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式,由于struts2没有对这些前缀做过滤,导致命令执行。
一直到最近的S2-020,以及后续的补丁被绕过,又让伤痕累累的struts2火了一把,但是这次问题不是出在ognl执行上,而是换成了操控容器的classLoader属性,这个其跟前面提到的S2-009有点类似,因为struts2框架有这样一个特性,只要接受到用户提交aa=bb这样的请求时,就会通过OGNL去执行对应的setaa方法,所以当用户去提交class.classLoader….这样的参数时,当然可以操控对应classLoader的属性,至于classLoader,不同的容器有不同的属性,能够控制这些属性是很危险的,比如tomcat的docBase可以控制根目录的位置等等。
关于S2-020的修复,官方发扬了他们一贯的作风,继续使用正则表达式这种“高端“技术过滤用户请求,可惜这次又没过滤好,被人家用各种奇技淫巧绕过。就这个问题来言,我想对struts2的开发人员说,你们什么时候能够关注一下底层代码呀。至于在S2-020补丁被绕过之后的修复,官方无奈还是用正则,但是这次他们总算确认要从根本上修复框架问题,所以坐等apache出最终补丁吧。Apache官方难辞其咎
回顾struts2的漏洞历史,我们发现官方难辞其咎,首先,开发人员安全意识不强,虽然采取了基本的安全措施,但是形同虚设。其次,官方修复力度不够,给我的感觉总像是在敷衍了事,未能从根本上解决问题。再就是,官方的开放精神确实很震撼,竟然直接将漏洞的PoC挂在官网,这样给了很多人进一步研究漏洞利用的机会,这个也是导致问题更加严重的一个原因。其实责任很明显,apache官方的问题。在这里我想提醒广大java开发人员以及系统运维人员,面对这么一个漏洞百出的框架,你还敢用吗,还是早日换掉这个危险的struts2吧!
近两年关于struts2的攻击事件频发,攻击面覆盖各大门户网站,包括向移动、电信、联通、各大网银、证券等等,因为struts2是一款功能非常强大的j2ee框架,特别是对于广大开发人员,应用非常广泛。所以一旦struts2出现0day,导致互联网上出现大面积被入侵、被拖库,信息泄露等事件。对于此问题,360建议相关技术人员应及时更新struts2框架版本。如果有能力,最好自己去开发应用框架,避免使用开源框架。struts2漏洞盘点影响比较大,利用比较广泛的struts2漏洞:2010年 S2-005CVE- XWork ParameterInterceptors bypass allows OGNLstatement execution2012年1月 S2-008CVE- struts2 DevMod Remote Command Execution Vulnerability2012年1月 S2-009CVE- Struts&=2.3.1参数拦截器代码执行2013年 5月 S2-013CVE- Struts2 &= 2.3.14 includeParams属性远程命令执行漏洞2013年7月 S2-016CVE- Struts2 &= 2.3.15.1 action、redirect、redirectAction前缀远程命令执行漏洞2014年3月 S2-020Struts2 &= 2.3.16 DoS attacks and ClassLoader manipulation2014年4月 S2-021Struts2 &= 2.3.16.1 bypass patch(ClassLoader manipulation)具体参照struts2官网提供的漏洞历史:https://cwiki.apache.org/confluence/display/WW/Security+Bulletins转自:Freebuf
老软件工程师的自白:编程平庸也可以成为优秀软件工程师
老程序员的自白:编程平庸也可以成为优秀程序员我一直以编写代码为乐,起因并不是我精于此道,而要部分归因于它是一大挑战。
 我一直以编写代码为乐,起因并不是我精于此道,而要部分归因于它是一大挑战。我发现没有什么比指挥个人电脑在显示器上显示“Hello World!”更令人激动的了。而在显示器上显示三个红桃或者黑桃A(Ace)和J(Jack)则是一个完全不同的问题。我毕业后写的第一个程序是用Northstar Basic为NorthStar Horizon编写一个自动售货机程序,后来又为Northstar Advantage编写了基于图形的21点纸牌(Blackjack)游戏程序。
  PurpleEndurer注:
  1、Northstar Basic:是源自NorthStar Horizon 和 NorthStar Advantage的一种BASIC语言。详见 http://en.wikipedia.org/wiki/NorthStar_BASIC
  2、NorthStar Horizon:是North Star Computers公司生产、以ZiLOG Z80A为处理器的8位电脑。详见http://en.wikipedia.org/wiki/NorthStar_Horizon
  尽管如此陶醉于编程,但我必须坦白地承认:我是一个平庸的程序员,总在寻找一种方法来获得大的回报 - 即程序没有语法错误并能正常运行。这并不奇怪,我从未像一名程序员那样做好本职工作;我发现自己具有成为一名优秀开发人员的天赋。但是,在我们继续往下谈之前,我要给“平庸程序员”下一个定义。
  平庸程序员——会使用一些现成工具的程序员。他只知道最简单的命令语法,但懂得在哪能找到更复杂命令的语法。他不知道如何编写最高效的代码,但懂得在必要时如何重写和测试比较高效的代码。他可以克服重重困难独辟蹊径达到目标,但他把每个困难视为挑战,并自信会找到每一个困难的解决方法。他可能需要较长时间才能完成,但总能达到目标。他不知道如何创建一个DLL,但在必要时可以弄懂。他与大多数程序员一样,并不特别喜欢做工作记录,之所以这样做是因为他是一个专家。
  工作决定技能
  虽然我很想继续编写游戏,但为了填饱肚子,我只得迁就本地就业市场;公司们有“必需胜任实际工作”这个奇怪的要求是众所周知的。产品、人力资源、会计、库存跟踪和数据报告只是做生意必要的一些东西 - 你知道,很无聊的东西。
  当我真正为报酬而编写程序时,我的技能发生了戏剧性地变化。它不需要采用大量先进的编码技术来围着数据团团转,并耍魔术般地变成信息。
  我被 休斯飞机(Hughes Aircraft)公司雇用,通过IT服务来为产品控制部门提供支持。我的工作需要开发/分析技能,我热爱我的工作。编程不过是达到目的的手段。
  开发人员身兼数职
  程序员只是开发人员所扮演的诸多角色中的一个,通常你要身兼以下数职:
  购买方(带预算)Buyer (with budget)
  清道夫(无预算)Scavenger (no budget)
  分析师(Analyst)
  设计师(Designer)
  规划师(Planner)
  程序员(Programmer)
  协调员(Coordinator)
  测试员(Tester)
  文档管理员(Documenter)
  技术支持员(Support technician)
  当开发人员未被认可为一个或更多角色中的专家时并不太令人奇怪。对我来说,工作职能就是编程。
  我的生存之道
  尽管我的编程技能不尽如人意,我仍然是一个非常成功的开发人员。这里有一些我多年来学到的诀窍,以及如何我作为一个平庸程序员,发挥出最佳平均编码技能水平的生存之道:
  ▲ 明确要求——我会预先得到完整、精确的系统要求清单。如果你直接开始编码就意味着你没有针对系统设计的要求来进行。
  ▲ 分析和设计——我获得了分析和设计权。一名普通程序员获得了分析和设计权,就拥有了一个超越一名伟大的程序员的优势。
  ▲ 项目计划——坦白来说,我早期职业生涯中没有用过正式的项目计划,一直到我加入了CSC,不得不使用更多的正式文档编制技术,从而开始使用项目计划。由此我充分认识到使用经过慎重考虑后的项目计划也是平庸程序员的一个优势。
  ▲ 经常翻阅手册、指南——我总是备有手册、指南以供不时之需。我也研究了其它的参考材料。
  ▲ 拷贝-粘贴程序员——我不介意承认自己是一名拷贝-粘贴程序员。多年来,我写了许多可以在新项目中重复使用的代码。因为我至少花时间写了一次代码,所以我对这些代码如何工作略知一二。在工作中我从不拷贝其他人写的代码,并且我从不使用我在其他公司写的代码。黄金规则和版权法都适用于知识产权:您不得复制和使用别人的代码,除非明确允许,或者你可以得到特别的许可。
  ▲ 毅力——我永不放弃,我一直相信自己能完成任何编程任务。
  ▲ 工具——当我需要一台更快的电脑但这又不在预算之列时,我发现了一个经理愿意用他们的一部分预算资金为我购买。你可以通过乞求、借用,或交易来获取所需工具,从而完成自己的任务,要经常向你的经理提出自己的要求;只这些要求是合理的,一个优秀的经理会尽最大努力找到一种方式来获得软件,硬件,手册,或者你所需要的帮助。
  ▲ 手气好(Serendipity)——也被称为“代码一写就好”策略。有几次我像一个初级程序员那样写了代码,而这些代码运行得很好。我把它比作是国际象棋,你在下棋的过程中突然发现,自己走两步就有将死的机会。这不是编程应有的方法,但由于我在检讨自己的职业中的罪过,我不得不纳入此项。
  我要做一个最终坦白:我不喜欢被看作是次等的团队成员。我见识卓越,而幼稚的程序员却真的相信:不能写出“先进”代码的人对团队和公司来说毫无价值。这些精英认为平庸的程序员能力有限,不足以生产高品质的代码,几乎总是犯错,令人不快。有个观念令我感觉既可笑又惊讶:如果你不能________(填空),就不是优秀的程序员。
  你不必成为一个出色的程序员或伟大的开发者,特别是正在开发商用系统的时候。没错,我是一个平庸的程序员,其主要原因是我从来不需要成为一个伟大的程序员。
  我不是纵容平庸。不论做什么,都要尽力做好——包括编程。“最好”的代码可能难以确定,但越高效的代码可能也越难维护。可以说,任何可以完成工作的代码就是好的代码。代码是像索玛立方体(Soma cube),有240种途径可以解决索玛难题,同样,也有许多代码编写方法可以用来完成任务。底线就是尽可能做好工作——这是任何一个平庸的程序员都可以做到的
海量Android教程、开发资料和源码
海量Linux学习教程和开发资料
海量C、C++、MFC和VC++教程、源码和开发资料
海量Java教程、开发资料和源码
我5年程序员人生的点点滴滴
老程序员的忠告:不要做浮躁的软件工程师
成为Java高手的25个学习目标--非常经典
古往今来中国最经典的五十句名言
43个不可不知的健康常识,终生受益!
2012年-2059年美国、日本和中国GDP预测
2012年4月发布的世界各国/地区人均GDP 排名
古代四大美男、四大丑女和四大美女
穷人和富人心态的最大区别
毕业五年决定你的一生
12种最养男人的食物和10种最养女人的食物
永远不要问研究生的15个问题--never
老中医的顺口溜,太实用了!
教你如何看清一个人的本质 很靠谱的
请问一个STL中stack的遍历
请教一个STL中stack的遍历?请问STL中的stack是怎么遍历的,它好像没提供遍历和清空操作。在使用stack的时候如果要用到清空或是遍历的时候怎么办,清空的时候可以用while(str.empty())str.pop();遍历的时候是不是要自己用继承机制写遍历的代码??------解决方案--------------------换容器吧,stack不适合你的要求.你可以用list
------解决方案--------------------没有
stack的属性就是如此
------解决方案--------------------我将这两个文件库给粘贴了下来,可以给以后发帖的人一个很好的参照.他们就不用再费心找这些东西了!C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。操作
比较和分配堆栈
堆栈为空则返回真
移除栈顶元素
在栈顶增加元素
返回栈中元素数目
返回栈顶元素
Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.
assign() 给list赋值
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回list的配置器
insert() 插入一个元素到list中
max_size() 返回list能容纳的最大元素数量
merge() 合并两个list
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
rbegin() 返回指向第一个元素的逆向迭代器
remove() 从list删除元素
remove_if() 按指定条件删除元素
rend() 指向list末尾的逆向迭代器
resize() 改变list的大小
reverse() 把list的元素倒转
size() 返回list中的元素个数
sort() 给list排序
splice() 合并两个list
swap() 交换两个list
unique() 删除list中重复的元素
------解决方案--------------------楼主不必折腾stack了遍历就是全pop出来,push回去不累啊
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:struts2的action是不是线程安全的?为什么?struts1的action了?_百度知道
struts2的action是不是线程安全的?为什么?struts1的action了?
提问者采纳
原因是,都用同一个action实例处理,对每一个请求分配一个新的action实例进行处理,因此不存在线程不安全的问题Struts1的action不是线程安全的。Struts2的机制是,就导致了线程的不安全,不同用户的相同请求,是线程安全的
提问者评价
谢谢你帮我大忙了
其他类似问题
并且要在开发时特别小心;Struts 2 Action对象为每一个请求产生一个实例《strut2权威指南》中有这么一段,因为仅有Action的一个实例来处理所有的请求,Action资源必须是线程安全的或同步的。单例策略限制了Struts1 Action能做的事: Struts1 Action是单例模式并且必须是线程安全的,因此没有线程安全问题
为您推荐:
线程安全的相关知识
其他1条回答
struts2是线程安全的,struts1不是
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁&?xml&version="1.0"&encoding="UTF-8"?&
&&XWork&Validators&DTD.
&&Used&the&following&DOCTYPE.
&&&!DOCTYPE&validators&PUBLIC&
&&&&&&&&&&"-//OpenSymphony&Group//XWork&Validator&1.0.2//EN"&
&&&&&&&&&&"/xwork/xwork-validator-1.0.2.dtd"&
&!ELEMENT&validators&(field|validator)+&
&!ELEMENT&field&(field-validator+)&
&!ATTLIST&field
&&&&name&CDATA&#REQUIRED
&!ELEMENT&field-validator&(param*,&message)&
&!ATTLIST&field-validator
&&&&type&CDATA&#REQUIRED
&&&&short-circuit&(true|false)&"false"
&!ELEMENT&validator&(param*,&message)&
&!ATTLIST&validator
&&&&type&CDATA&#REQUIRED
&&&&short-circuit&(true|false)&"false"
&!ELEMENT&param&(#PCDATA)&
&!ATTLIST&param
&&&&name&CDATA&#REQUIRED
&!ELEMENT&message&(#PCDATA)&
&!ATTLIST&message
&&&&key&CDATA&#IMPLIED
可以看到,数据校验XML的根元素&validator&下面可以包含两种 子元素:field和validator
1、前者field&&&& 是针对字段进行的校验;
2、后者validator 是非字段或者说全局范围的校验。
在介绍完校验是怎么回事后,后面会简单比较一下两种校验方式的区别。
一、字段校验:(field)
先看个基本示例
&validators&
&&&&&field&name="username"&
&&&&&&&&&field-validator&type="requiredstring"&
&&&&&&&&&&&&&message&key="error.username.required"/&
&&&&&&&&&/field-validator&
&&&&&/field&
&&&&&&&&&field&name="password"&
&&&&&&&&&&&&&&&&field-validator&type="stringlength"&
&&&&&&&&&&&&&param&name="trim"&true&/param&
&&&&&&&&&&&&&param&name="minLength"&<span style="color: #&/param&
&&&&&&&&&&&&&param&name="maxLength"&<span style="color: #&/param&
&&&&&&&&&&&&&message&password&should&be&${minLength}&to&${maxLength}&characters&long.&/message&
&&&&&&&&&/field-validator&
&&&&&&&&&/field&
&/validators&
有几个地方需要注意一下的。
1、field-validator的type在哪里定义的?
struts2校验框架预设的类在包com.opensymphony.xwork2.validator.validators中,同一目录下的default.xml中定义了field-validator中type的名称和对应的处理类。
default.xml
&!--&START&SNIPPET:&validators-default&--&
&validators&
&&&&&validator&name="required"&class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/&
&&&&&validator&name="requiredstring"&class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/&
&&&&&validator&name="int"&class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/&
&&&&&validator&name="double"&class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/&
&&&&&validator&name="date"&class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/&
&&&&&validator&name="expression"&class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/&
&&&&&validator&name="fieldexpression"&class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/&
&&&&&validator&name="email"&class="com.opensymphony.xwork2.validator.validators.EmailValidator"/&
&&&&&validator&name="url"&class="com.opensymphony.xwork2.validator.validators.URLValidator"/&
&&&&&validator&name="visitor"&class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/&
&&&&&validator&name="conversion"&class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/&
&&&&&validator&name="stringlength"&class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/&
&&&&&validator&name="regex"&class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/&
&/validators&
&!--&&END&SNIPPET:&validators-default&--&
其中,name是上面type需要引用的名字,而后面的class则是这些validator对应的类。这些类中大部分都是自解释的,其中fieldexpression比较特殊,它提供了一种多个field之间比较值的机制。
2、param的值又是在哪里找到的呢?
param中的name值在上述类中被定义为属性。譬如说在类com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator中(也就是stringLength对应的处理类),就定义了
int minLength,maxL
及它们的get/set方法。
3、message的注意事项
(1)每个field都必须拥有一个message;message错误信息最后是以addFieldError实现的,也就是说是field一级的错误。
(2)message中可以引用param变量,引用格式为${param1},如上面的例子中对password验证失败的报错信息。
(3)message的内容可以放到全局i18n属性文件中,并在message中以key属性值指定,比如上面例子中对username验证失败的报错信息。
二、非字段校验/全局校验
全局校验和字段校验其实类似,使用的验证器也是那些。区别在于校验的方式和关注点不同:
1、字段校验先指定那个字段要校验,再指定用那些校验器来校验该字段;
2、全局校验不针对特定字段,先指定验证器,再来指定用该校验器校验那些字段。
基本示例如下:
&validators&
&&&&&validator&type="requiredstring"&short-circuit="true"&
&&&&&&&&&param&name="fieldName"&username&/param&
&&&&&&&&&message&key="error.field.required"/&
&&&&&/validator&
&&&&&&validator&type="stringlength"&
&&&&&&&&&&&&&param&name="trim"&true&/param&
&&&&&&&&&&&&&param&name="minLength"&<span style="color: #&/param&
&&&&&&&&&&&&&param&name="maxLength"&<span style="color: #&/param&
&&&&&&&&&&&&&param&name="fieldName"&password&/param&
&&&&&&&&&&&&&message&password&should&be&${minLength}&to&${maxLength}&characters&long.&/message&
&&&&&&/validator&&&&&&&&&
&/validators&
示例很简单,第一个validator是校验&#8220;不为空的字符串&#8221;,校验&#8220;用户名字段,第二个校验器校验&#8220;字符串长度6-10&#8221;,校验&#8220;密码两个字段。
很明显,如果页面中存在一些共性的验证要求,用这种方式就比针对字段的验证要方便。但这种方式可能不如前一种方式清晰易读。
上面这段话是错误的。
我原以为第二种验证器优先的方式可以一次验证多个field,但经验证struts(ver2.1.6)并不支持多个field的批量验证,只能一个一个写,比较遗憾。
两种验证方式可以混用。
三、其他问题
1、对多验证和跳转逻辑的支持
和中所说内容一样,校验框架也支持多验证和跳转逻辑。比如说在struts.xml文件中配置了
&action&name="XXXAction"&class="com.myspace.myname.XXXAction"&method="newExcuteName"&
&&&&&&&result&success.jsp&/result&
则校验文件的名字为XXXAction-newExcuteName-validation.xml
当然,在执行了上面的校验之后,如果存在XXXAction-validation.xml,则还会执行这个文件中定义的校验。
同时需要注意的是,如果该Action存在父类,则会先行执行父类的相应校验。
2、客户端校验
客户端校验是不安全的,但struts仍然提供了客户端的校验
方法是在&s:form&中设置validate属性为true,如果该属性被设置,则struts不会在服务器端验证,取而代之的是在客户端生成Javascript代码。但这些Js代码功能较弱,灵活度也比较低,且不会刷新。因此不推荐使用。
其实struts的控件本身和一般的HTML控件一样,如果想做客户端验证,可以触发它们的onXXX()事件,和通常的HTML页面做法一样。
阅读排行榜
评论排行榜

我要回帖

更多关于 struts2 安全漏洞测试 的文章

 

随机推荐