`
JadeLuo
  • 浏览: 425627 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

SpringMVC 重写HttpMessageConverter进行Xss过滤

    博客分类:
  • java
 
阅读更多

https://my.oschina.net/jayhu/blog/653725

public interface MessageConverterHandler<T, K> {

	/**
	 * 用于在httpMessageConverter read(..)方法完成之后调用
	 * <p>
	 * 1.可以对converter映射出的Object进行处理
	 * </p>
	 */
	public Object readAfter( T obj, K type );
}

 

  2.自定义注解NeedXss

    该注解用于需要xss过滤的字段

@Target( ElementType.FIELD )
@Retention( RetentionPolicy.RUNTIME )
@Documented
public @interface NeedXss {
}

 

//默认会过滤所有请求路径,只会过滤String类型的字段,需要其他类型过滤的请自行完善
public class XssMappingJacksonHttpMessageConverter extends MappingJacksonHttpMessageConverter implements
		MessageConverterHandler<Object, Type> {

	/**
	 * 不需要xss过滤的路径
	 */
	protected static List<String> urls;

	static {
		urls = new ArrayList<String>();
		// for example urls.add("/xxx/xxxxx");
	}
        
        //重写该方法,我们只需要加上Object tempObj = this.process( obj, type, inputMessage );
        //并返回tempObj,process方法里面我们过滤白名单和进行xss处理
	@Override
	public Object read( Type type, Class<?> contextClass, HttpInputMessage inputMessage ) throws IOException,
			HttpMessageNotReadableException {

		JavaType javaType = getJavaType( type, contextClass );

		Object obj = readJavaType( javaType, inputMessage );

		Object tempObj = this.process( obj, type, inputMessage );

		return tempObj;
	}

	//这个就是父类的readJavaType方法,由于父类该方法是private的,所以我们copy一个用
	private Object readJavaType( JavaType javaType, HttpInputMessage inputMessage ) {
		try {
			return super.getObjectMapper().readValue( inputMessage.getBody(), javaType );
		} catch ( IOException ex ) {
			throw new HttpMessageNotReadableException( "Could not read JSON: " + ex.getMessage(), ex );
		}
	}
        
        
	protected Object process( Object obj, Type type, HttpInputMessage inputMessage ) {
		if ( this.isNeedProcess( inputMessage ) ) {
			return this.readAfter( obj, type );
		} else {
			return obj;
		}
	}

	//根据白名单,判断当前请求路径是否需要xss过滤
	protected boolean isNeedProcess( HttpInputMessage inputMessage ) {

		String url = "";

		try {
		        //经过debug发现inputMessage类型为ServletServerHttpRequest,所以进行下类型转换
			ServletServerHttpRequest request = ( ServletServerHttpRequest ) inputMessage;

			url = request.getURI().getPath();

			//根据白名单做下匹配,当然也可以实现正则什么的,代码就不贴了

		} catch ( Exception e ) {
			logger.error( "BACK_ERROR," + this.getClass().getCanonicalName() + ",XSS处理-url处理失败,url=" + url + ",ERROR=", e );
			return true;
		}

		return true;

	}

	//最重要的一步,进行xss过滤
	@Override
	public Object readAfter( Object obj, Type type ) {
		try {
		        //type实际上就是我们需要convert的model,我们通过反射来完成根据NeedXss注解对String
		        //的字段进行xss过滤
			Class clazz = Class.forName( JSON.toJSONString( type ).replace( "\"", "" ) );

			if ( clazz == null ) {
				return obj;
			}

			Field[] fields = clazz.getDeclaredFields();

			if ( fields != null && fields.length > 0 ) {
				// string类型字段名称列表
				List<String> strList = new ArrayList<String>( fields.length );

				// 1. 将需要xss处理的string类型的字段放入strlist
				for ( int i = 0; i < fields.length; i++ ) {

				        // 1.1该属性是否有NeedXss.class注解
					NeedXss needXss = fields[ i ].getAnnotation( NeedXss.class );
					// 1.2如果该没有NeedXss.class注解,则不处理该属性
					if ( needXss == null || !( needXss instanceof NeedXss ) ) {
						continue;
					}

					String mod = Modifier.toString( fields[ i ].getModifiers() );
					if ( mod.indexOf( "static" ) != -1 )
						continue;
					// 得到属性的类名
					String className = fields[ i ].getType().getSimpleName();
					// 得到属性字段名
					if ( className.equalsIgnoreCase( "String" ) ) {

						strList.add( fields[ i ].getName() );
					}

				}

				// 2.将strlist中的字段进行xss处理
				if ( strList.size() > 0 ) {

					Object temp = JSON.toJavaObject( ( JSON ) JSON.toJSON( obj ), clazz );

					for ( int i = 0; i < strList.size(); i++ ) {
						Method set = clazz.getMethod( "set" + strList.get( i ).substring( 0, 1 ).toUpperCase()
								+ strList.get( i ).substring( 1 ), String.class );
						Method get = clazz.getMethod( "get" + strList.get( i ).substring( 0, 1 ).toUpperCase()
								+ strList.get( i ).substring( 1 ) );

						Object tempObj = get.invoke( temp );

						if ( tempObj == null ) {
							break;
						}

						String content = tempObj.toString();

						set.invoke( temp, StringUtils.cleanXss( content ) );
					}

					return temp;
				}

			}

		} catch ( Exception e ) {
			logger.error( "BACK_ERROR," + this.getClass().getCanonicalName() + ",XSS处理失败,obj=" + JSON.toJSONString( obj ) + ",javaType="
					+ JSON.toJSONString( type ) + ",ERROR=", e );
			return obj;
		}

		return obj;
	}

 

 4.配置使用自定义的XssMappingJacksonHttpMessageConverter

    在SpringMVC的配置文件里面加上下面的配置

    <mvc:annotation-driven >
		<mvc:message-converters register-defaults="true">
			<!-- 将StringHttpMessageConverter的默认编码设为UTF-8. -->
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<constructor-arg value="UTF-8" />
			</bean>
			
			<bean class="com.zhubajie.seller.common.converter.XssMappingJacksonHttpMessageConverter">
				<property name="prettyPrint" value="false" />
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

 

分享到:
评论

相关推荐

    springmvc4配置防止XSS攻击的方法

    具体地,需要创建一个包装类XssHttpServletRequestWrapper,用于覆盖HttpServletRequest的方法,对所有进入的请求数据进行XSS过滤处理。 首先,创建XssHttpServletRequestWrapper类继承自HttpServletRequestWrapper...

    SpringMVC 中HttpMessageConverter简介和Http请求415 的问题

    为了解决这个问题,我们需要在SpringMVC的配置文件(如`springMVC-config.xml`)中添加或调整HttpMessageConverter。在上述示例中,添加了`StringHttpMessageConverter`,这个转换器专门用于处理字符串数据。配置...

    Spring-MVC处理XSS、SQL注入攻击的方法总结

    XSS 攻击是指攻击者利用网站程序对用户输入过滤不严,将恶意脚本注入到网页中,当其他用户浏览该页面时,脚本就会被执行,从而达到窃取用户资料、利用用户身份进行某种操作等目的。XSS 攻击主要分为三种类型:反射型...

    SpringMVC DispatcherServlet重写、自定义拦截器拦截器源码

    SpringMVC DispatcherServlet重写、自定义拦截器拦截器源码

    SpringMVC源码剖析(五)-消息转换器HttpMessageConverter1

    SpringMVC源码剖析(五)- 消息转换器HttpMessageConverter1 在SpringMVC中,有一个非常重要的机制,即消息转换器HttpMessageConverter,它负责将HTTP请求和响应报文转换为Java对象和反之。为了更好地理解这个机制...

    防sql注入和xss攻击, springmv拦截器

    防sql注入和xss攻击, springmv拦截器,可自由调整需要拦截的字符

    spring MVC 对 ResponseBody返回json数据进行脱敏处理

    这可以通过自定义`WebMvcConfigurer`并重写`extendMessageConverters`方法来实现: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void ...

    spring+springmvc+mybatis项目案例实现用户角色权限管理

    使用spring+springmvc框架 ...使用了urlrewrite filter进行地址重写,实现伪静态页面 使用了sitemesh对网页进行布局和修饰 使用了loginFilter对访问进行登录过滤 使用了CheckCodeServlet生成验证码图片

    SpringMVC PPT_springmvc_

    SpringMVC 提供了 MockMVC 工具,可以方便地对 Controller 进行单元测试,无需部署到服务器。 总结,SpringMVC 以其强大的功能和灵活性,成为了 Java Web 开发的主流框架之一。通过理解并熟练掌握上述知识点,...

    springmvc+shiro自定义过滤器的实现代码

    SpringMVC+Shiro自定义过滤器的实现代码 itle"springmvc+shiro自定义过滤器的实现代码"所涉及的知识点如下: 1. SpringMVC拦截器 在SpringMVC中,拦截器(Interceptor)是一种特殊的Bean,它可以在请求处理之前、...

    Spring4.2.9+mybatis3.4.4集成(整合Jackson、防御XSS版)支持JDK1.6、Tomcat6

    2. **过滤输入**:对所有用户输入进行检查和清理,移除或转义可能的恶意脚本。 3. **使用安全的模板引擎**:如Thymeleaf,它可以自动进行XSS防御。 4. **启用Spring的安全模块**:如Spring Security,它提供了一套...

    SpringMVC+Hibernate+EXT

    EXTJS还提供了强大的数据包装和远程数据通信机制,如Ajax和Store,能够轻松与后端服务如SpringMVC+Hibernate进行交互。 【整合】 SpringMVC+Hibernate+EXT的整合是Web开发中的常见模式,用于构建高效、功能丰富的...

    SpringMVC源码解析之消息转换器HttpMessageConverter

    SpringMVC源码解析之消息转换器HttpMessageConverter SpringMVC中的消息转换器HttpMessageConverter是实现请求报文和对象、对象和响应报文之间的自动转换的关键机制。该机制通过使用@RequestBody和@ResponseBody两...

    应用SpringMVC与Hibernate进行WEB开发.pdf

    应用SpringMVC与Hibernate进行WEB开发.pdf

    springMVC练手代码

    2. **配置文件**:SpringMVC的配置通常在XML文件(如`servlet-context.xml`)中进行,包括视图解析器、模型-视图映射、拦截器、以及bean的定义。这些配置会指导SpringMVC如何处理请求和响应。 3. **模型(Model)**:...

    springmvc实战项目sample

    SpringMVC支持使用注解进行开发,如`@Controller`、`@RequestMapping`、`@Service`、`@Autowired`等,简化了XML配置。 6. **异常处理** 可以通过`@ExceptionHandler`注解自定义全局异常处理,或者配置`...

    SpringMVC+sqlitejdbc的jar集合

    SpringMVC中的Service层可以利用SQLiteJDBC进行数据操作,通过Repository接口封装数据访问逻辑,保持业务逻辑与数据访问的分离。 **集成步骤** 1. **添加依赖**:在项目的pom.xml文件中引入SpringMVC和SQLiteJDBC...

    SpringMVC+Mybatis demo

    4. **Service层**:Service层是业务逻辑的核心,它调用Mapper接口进行数据库操作,通常会使用@Service注解并注入Mapper接口。 在"SpringMVC+Mybatis demo"的Service端,开发者已经实现了基于SpringMVC和MyBatis的...

    SpringMVC学习编程代码

    此外,SpringMVC支持数据绑定和验证,可以通过`@ModelAttribute`注解将请求参数绑定到Java对象,并利用`@Valid`和`Validator`接口进行数据验证。 对于异常处理,SpringMVC提供了`@ExceptionHandler`注解,可以用来...

Global site tag (gtag.js) - Google Analytics