数据对象安全校验(oval框架)

来源:互联网 发布:cygwin与linux区别 编辑:程序博客网 时间:2024/05/22 15:53

很多时候我们都是忽略了对象数据的合法性,以为简单通过前台的js验证下是否正确就可以了,这后果比较让人但疼,下面举例个简单的例子,页面需要用户提交个简介,用户

这个时候可以写脚本在这个内容里,你说你在js有校验合法性,但是你要明白,现在的抓包工具是可以等你提交的时候,拦截住请求,然后通过编辑器修改了提交的值来绕过前台的js

验证,这样就造成了数据的不合法,所以如果数据安全要求高的,必须在后台再次验证合法性,下面我讲下选择的这个对象校验框架---oval


OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件、Annotation、POJOs 进行设定。可以使用纯 Java 语言、JavaScript 、Groovy 、BeanShell 等进行规则的编写。网上资料是很少,所以自己学习的时候碰壁比较多


oval框架可以支持xml,注解配置,我个人倾向于xml配置,因为不想看到一个实体类的字段上写了n多的注解,所以下面我说下如何使用这个框架,灰常简单,暴力,灵活,不需要与页面的表单层打交道


先看看如何单独使用,比较简单


[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public static void main(String[] args) {  
  2.         try {  
  3.             XMLConfigurer configurer = new XMLConfigurer(new File("valid-oval.xml"));  
  4.             Validator validator = new Validator(configurer);  
  5.             List<ConstraintViolation> violations = validator.validate(new Object());  
  6.             for (ConstraintViolation violation : violations) {  
  7.                 System.out.println(violation.getMessage());  
  8.             }  
  9.         } catch (IOException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  

直接通过validate方法传入你需要校验的对象即可,然后看看valid-oval.xml配置文件该如何写


[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" ?>  
  2. <oval  
  3.   xmlns="http://oval.sf.net/oval-configuration"  
  4.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.   xsi:schemaLocation="http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration.xsd">  
  6.     
  7.   <constraintSet id="testPattern">  
  8.     <notNull />  
  9.     <matchPattern message="只允许纯数字组合">  
  10.       <pattern pattern="[0-9]+" flags="0" />  
  11.     </matchPattern>  
  12.   </constraintSet>  
  13.     
  14.   <class type="com.silvery.project.cms.model.Authority" overwrite="false" applyFieldConstraintsToSetter="true">  
  15.   
  16.     <field name="name">  
  17.       <maxSize max="5" message="最多允许{max}个字符" />  
  18.       <assertConstraintSet id="testPattern" />  
  19.     </field>  
  20.       
  21.     <field name="content">  
  22.       <assertConstraintSet id="testPattern" />  
  23.     </field>  
  24.       
  25.   </class>  
  26.     
  27.     
  28. </oval>  

有默认的校验实现,有可自定义正则校验,完全可以满足你需要扩展的野心(不得不说有个深坑,我首次下载的是oval-1.84版本,自定义正则死活抛异常,然后换了个1.8的版本马上可以,不知道是不是我的用法有问题,还是bug,有空再仔细研究)



下面再看看如何与spring结合配置


先声明一个validator校验器

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <description>OVAL数据校验器配置</description>  
  2.   
  3.     <bean id="validator" class="net.sf.oval.Validator">  
  4.         <constructor-arg>  
  5.             <list>  
  6.                 <bean class="net.sf.oval.configuration.xml.XMLConfigurer">  
  7.                     <constructor-arg type="java.io.InputStream" value="classpath:valid-oval.xml" />  
  8.                 </bean>  
  9.             </list>  
  10.         </constructor-arg>  
  11.     </bean>  


然后类里面直接注入validator即可


[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Autowired(required = false)  
  2.     protected Validator validator;  

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. if (!validModel) {  
  2.             return viewResult.setFormValid(true);  
  3.         }  
  4.         Validator validator = getValidator();  
  5.         if (validator != null) {  
  6.             List<ConstraintViolation> violations = getValidator().validate(obj);  
  7.             if (!isNull(violations)) {  
  8.                 viewResult.setFormValid(false);  
  9.                 viewResult.setFormErrors(validErrorToList(violations));  
  10.             } else {  
  11.                 viewResult.setFormValid(true);  
  12.             }  
  13.         }  
  14.         return viewResult;  

下面再看看如何使用注解的方式,虽然这个更方便,但是我觉得还是xml配置比较好管理


[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private static class TestEntity  
  2. {  
  3.   @Min(1960)  
  4.   private int year = 1977;  
  5.   
  6.   @Range(min=1max=12)  
  7.   private int month = 2;  
  8.   
  9.   @ValidateWithMethod(methodName = "isValidDay"parameterType = int.class)  
  10.   private int day = 31;  
  11.   
  12.   private boolean isValidDay(int day)  
  13.   {  
  14.     GregorianCalendar cal = new GregorianCalendar();  
  15.     cal.setLenient(false);  
  16.     cal.set(GregorianCalendar.YEAR, year);   
  17.     cal.set(GregorianCalendar.MONTH, month - 1);  
  18.     cal.set(GregorianCalendar.DATE, day);  
  19.     try {  
  20.       cal.getTimeInMillis(); // throws IllegalArgumentException  
  21.     } catch (IllegalArgumentException e) {   
  22.       return false;  
  23.     }  
  24.     return true;  
  25.   }  
  26. }  
RE: http://blog.csdn.net/shadowsick/article/details/40345019 
0 0
原创粉丝点击