shiro安全框架扩展教程--数据对象安全校验(oval框架)
2014-10-21 15:24
585 查看
很多时候我们都是忽略了对象数据的合法性,以为简单通过前台的js验证下是否正确就可以了,这后果比较让人但疼,下面举例个简单的例子,页面需要用户提交个简介,用户
这个时候可以写脚本在这个内容里,你说你在js有校验合法性,但是你要明白,现在的抓包工具是可以等你提交的时候,拦截住请求,然后通过编辑器修改了提交的值来绕过前台的js
验证,这样就造成了数据的不合法,所以如果数据安全要求高的,必须在后台再次验证合法性,下面我讲下选择的这个对象校验框架---oval
OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件、Annotation、POJOs 进行设定。可以使用纯 Java 语言、JavaScript 、Groovy 、BeanShell 等进行规则的编写。网上资料是很少,所以自己学习的时候碰壁比较多
oval框架可以支持xml,注解配置,我个人倾向于xml配置,因为不想看到一个实体类的字段上写了n多的注解,所以下面我说下如何使用这个框架,灰常简单,暴力,灵活,不需要与页面的表单层打交道
先看看如何单独使用,比较简单
public static void main(String[] args) {
try {
XMLConfigurer configurer = new XMLConfigurer(new File("valid-oval.xml"));
Validator validator = new Validator(configurer);
List<ConstraintViolation> violations = validator.validate(new Object());
for (ConstraintViolation violation : violations) {
System.out.println(violation.getMessage());
}
} catch (IOException e) {
e.printStackTrace();
}
}
直接通过validate方法传入你需要校验的对象即可,然后看看valid-oval.xml配置文件该如何写
<?xml version="1.0" ?>
<oval
xmlns="http://oval.sf.net/oval-configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration.xsd">
<constraintSet id="testPattern">
<notNull />
<matchPattern message="只允许纯数字组合">
<pattern pattern="[0-9]+" flags="0" />
</matchPattern>
</constraintSet>
<class type="com.silvery.project.cms.model.Authority" overwrite="false" applyFieldConstraintsToSetter="true">
<field name="name">
<maxSize max="5" message="最多允许{max}个字符" />
<assertConstraintSet id="testPattern" />
</field>
<field name="content">
<assertConstraintSet id="testPattern" />
</field>
</class>
</oval>
有默认的校验实现,有可自定义正则校验,完全可以满足你需要扩展的野心(不得不说有个深坑,我首次下载的是oval-1.84版本,自定义正则死活抛异常,然后换了个1.8的版本马上可以,不知道是不是我的用法有问题,还是bug,有空再仔细研究)
下面再看看如何与spring结合配置
先声明一个validator校验器
<description>OVAL数据校验器配置</description>
<bean id="validator" class="net.sf.oval.Validator">
<constructor-arg>
<list>
<bean class="net.sf.oval.configuration.xml.XMLConfigurer">
<constructor-arg type="java.io.InputStream" value="classpath:valid-oval.xml" />
</bean>
</list>
</constructor-arg>
</bean>
然后类里面直接注入validator即可
@Autowired(required = false)
protected Validator validator;
下面再看看如何使用注解的方式,虽然这个更方便,但是我觉得还是xml配置比较好管理
private static class TestEntity
{
@Min(1960)
private int year = 1977;
@Range(min=1, max=12)
private int month = 2;
@ValidateWithMethod(methodName = "isValidDay", parameterType = int.class)
private int day = 31;
private boolean isValidDay(int day)
{
GregorianCalendar cal = new GregorianCalendar();
cal.setLenient(false);
cal.set(GregorianCalendar.YEAR, year);
cal.set(GregorianCalendar.MONTH, month - 1);
cal.set(GregorianCalendar.DATE, day);
try {
cal.getTimeInMillis(); // throws IllegalArgumentException
} catch (IllegalArgumentException e) {
return false;
}
return true;
}
}
这是别人的demo,我就懒得写了, 我写这个资料应该算是比较完整的了,希望对大家有帮助,还有比较多的功能,大家可以看下官方的api
这个时候可以写脚本在这个内容里,你说你在js有校验合法性,但是你要明白,现在的抓包工具是可以等你提交的时候,拦截住请求,然后通过编辑器修改了提交的值来绕过前台的js
验证,这样就造成了数据的不合法,所以如果数据安全要求高的,必须在后台再次验证合法性,下面我讲下选择的这个对象校验框架---oval
OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件、Annotation、POJOs 进行设定。可以使用纯 Java 语言、JavaScript 、Groovy 、BeanShell 等进行规则的编写。网上资料是很少,所以自己学习的时候碰壁比较多
oval框架可以支持xml,注解配置,我个人倾向于xml配置,因为不想看到一个实体类的字段上写了n多的注解,所以下面我说下如何使用这个框架,灰常简单,暴力,灵活,不需要与页面的表单层打交道
先看看如何单独使用,比较简单
public static void main(String[] args) {
try {
XMLConfigurer configurer = new XMLConfigurer(new File("valid-oval.xml"));
Validator validator = new Validator(configurer);
List<ConstraintViolation> violations = validator.validate(new Object());
for (ConstraintViolation violation : violations) {
System.out.println(violation.getMessage());
}
} catch (IOException e) {
e.printStackTrace();
}
}
直接通过validate方法传入你需要校验的对象即可,然后看看valid-oval.xml配置文件该如何写
<?xml version="1.0" ?>
<oval
xmlns="http://oval.sf.net/oval-configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration.xsd">
<constraintSet id="testPattern">
<notNull />
<matchPattern message="只允许纯数字组合">
<pattern pattern="[0-9]+" flags="0" />
</matchPattern>
</constraintSet>
<class type="com.silvery.project.cms.model.Authority" overwrite="false" applyFieldConstraintsToSetter="true">
<field name="name">
<maxSize max="5" message="最多允许{max}个字符" />
<assertConstraintSet id="testPattern" />
</field>
<field name="content">
<assertConstraintSet id="testPattern" />
</field>
</class>
</oval>
有默认的校验实现,有可自定义正则校验,完全可以满足你需要扩展的野心(不得不说有个深坑,我首次下载的是oval-1.84版本,自定义正则死活抛异常,然后换了个1.8的版本马上可以,不知道是不是我的用法有问题,还是bug,有空再仔细研究)
下面再看看如何与spring结合配置
先声明一个validator校验器
<description>OVAL数据校验器配置</description>
<bean id="validator" class="net.sf.oval.Validator">
<constructor-arg>
<list>
<bean class="net.sf.oval.configuration.xml.XMLConfigurer">
<constructor-arg type="java.io.InputStream" value="classpath:valid-oval.xml" />
</bean>
</list>
</constructor-arg>
</bean>
然后类里面直接注入validator即可
@Autowired(required = false)
protected Validator validator;
if (!validModel) { return viewResult.setFormValid(true); } Validator validator = getValidator(); if (validator != null) { List<ConstraintViolation> violations = getValidator().validate(obj); if (!isNull(violations)) { viewResult.setFormValid(false); viewResult.setFormErrors(validErrorToList(violations)); } else { viewResult.setFormValid(true); } } return viewResult;
下面再看看如何使用注解的方式,虽然这个更方便,但是我觉得还是xml配置比较好管理
private static class TestEntity
{
@Min(1960)
private int year = 1977;
@Range(min=1, max=12)
private int month = 2;
@ValidateWithMethod(methodName = "isValidDay", parameterType = int.class)
private int day = 31;
private boolean isValidDay(int day)
{
GregorianCalendar cal = new GregorianCalendar();
cal.setLenient(false);
cal.set(GregorianCalendar.YEAR, year);
cal.set(GregorianCalendar.MONTH, month - 1);
cal.set(GregorianCalendar.DATE, day);
try {
cal.getTimeInMillis(); // throws IllegalArgumentException
} catch (IllegalArgumentException e) {
return false;
}
return true;
}
}
这是别人的demo,我就懒得写了, 我写这个资料应该算是比较完整的了,希望对大家有帮助,还有比较多的功能,大家可以看下官方的api
相关文章推荐
- shiro安全框架扩展教程--设计数据对象校验器,如何防止xss以及csrf攻击
- shiro安全框架扩展教程--基本行级数据安全控制
- 数据对象安全校验(oval框架)
- shiro安全框架扩展教程--如何扩展实现我们的缓存机制(第三方容器redis,memcached)
- shiro安全框架扩展教程--如何扩展实现集中式session管理
- shiro安全框架扩展教程--异常退出没有清除缓存信息处理方案
- shiro安全框架扩展教程--如何扩展实现我们的缓存机制(第三方容器redis,memcached)
- shiro安全框架扩展教程--如何扩展异步(ajax)请求认证失败处理
- shiro安全框架扩展教程--整合cas框架扩展自定义CasRealm
- shiro安全框架扩展教程--整合cas框架扩展自定义CasRealm
- shiro安全框架扩展教程--如何防止可执行文件的入侵攻击
- shiro安全框架扩展教程--如何动态控制页面节点元素的权限
- shiro安全框架扩展教程--异常退出没有清除缓存信息处理方案
- shiro安全框架扩展教程--如何自定义适合项目的过滤器
- shiro安全框架扩展教程--如何扩展realm桥接器并退出自动清空角色资源缓存
- shiro安全框架扩展教程--验证码的安全(jcaptcha框架)
- shiro安全框架扩展教程--如何动态控制页面节点元素的权限
- shiro安全框架扩展教程--如何扩展实现集中式session管理(redis,memcached等)
- shiro安全框架扩展教程--异常退出没有清除缓存信息处理方案
- shiro安全框架扩展教程--上传文件的安全控制