• XSS攻击解决办法 Spring mvc databinder


    XSS攻击解决办法

    一、SpringMVC架构下@InitBinder方法
    Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型。若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数,服务端通过Request的getParameter方法取到的参数都是字符串形式,WebDataBinder的作用就是把字符串形式的参数转换成服务端真正需要的类型。
    每次请求到来后的参数解析都会利用WebDataBinderFactory创建一个binder对象,然后从这个binder中取得最终解析好的参数对象。WebDataBinderFactory是在InvocableHandlerMethod中定义的,即不同的Controller方法有着不同的WebDataBinderFactory。
    @InitBinder用于在@Controller中标注于方法,表示为当前控制器注册一个属性编辑器或者其他,只对当前的Controller有效,所以要用@InitBinder实现过滤输入,转义输出,就必须在每个需要的Controller中使用@InitBinder,我的方法就是创建一个BaseController,每个需要实现此业务的都去继承它。

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.InitBinder;
    
    @Controller
    public class BaseController {
        @InitBinder
        public void webInitBinder(WebDataBinder binder){
            binder.registerCustomEditor(String.class, new StringEditor());
        }
    }
    
    public class StringEditor extends PropertyEditorSupport {
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            if (StringUtils.isBlank(text)) {
                return;
            }
    
            try {
                //Spring自带html标签转义与反转义
                super.setValue(HtmlUtils.htmlEscape(text));
            } catch (Exception e) {
                throw new IllegalArgumentException(e);
            }
        }
    }
    

      WebBindingInitializer

    WebBindingInitializer:实现WebBindingInitializer,重写initBinder注册的属性编辑器是全局的属性编辑器,对所有的Controller都有效

    public class WebBinderInitializerUtils implements WebBindingInitializer{
    
        @Override
        public void initBinder(WebDataBinder binder, WebRequest request) {
            binder.registerCustomEditor(String.class,new StringEditor());
        }
    }
    
    public class StringEditor extends PropertyEditorSupport {
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            if (StringUtils.isBlank(text)) {
                return;
            }
    
            try {
                //Spring自带html标签转义与反转义
                super.setValue(HtmlUtils.htmlEscape(text));
            } catch (Exception e) {
                throw new IllegalArgumentException(e);
            }
        }
    }
    
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="cacheSeconds" value="0"/>
            <property name="webBindingInitializer">
                <bean class="cn.gov.wu.biz.utils.WebBinderInitializerUtils"/>
            </property>
        </bean>
    

      Spring MVC架构内还有蛮多方法可以实现此种功能,具体可见:http://www.tuicool.com/articles/BzqUja

    三、HttpOnly
    如果在cookie中设置了HttpOnly属性,那么通过javaScript脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,但是注意,只是不能读取,但是可以覆盖,攻击者如果发现网站的XSS漏洞,就可以利用HttpOnly cookie发动session fixation攻击。\\

    response.setHeader("Set-Cookie", "cookiename=value;
    Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
    

      

  • 相关阅读:
    RocketMQ Message hasn't been sent. Caused by No route info of this topic, test-topic
    Barrier
    WPF之资源
    WPF之命令
    WPF之事件
    WPF之属性
    多路Binding
    Binding的数据转换
    Binding的数据校验
    为Binding指定源的方法
  • 原文地址:https://www.cnblogs.com/ailiying/p/7976189.html
Copyright © 2020-2023  润新知