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");

  

最新文章

  1. Dagger2系列之使用方法
  2. Leetcode 112. Path Sum
  3. 网页抓取:PHP实现网页爬虫方式小结
  4. 轮子来袭 vJine.Core 之 AppConfig&lt;T&gt;
  5. hdoj 5461 Largest Point
  6. 随着visual studio 2013 发布.带来的一些变化
  7. 免费邮件服务器:MailEnable
  8. Linux中的常见配置文件
  9. HDOJ-1015 Safecracker(DFS)
  10. Python之Socket&amp;异常处理
  11. Ajax应用-定义一套自己的Ajax框架
  12. LeetCode 16. 3Sum Closest. (最接近的三数之和)
  13. github创建远程仓库
  14. Java订单功能模块设计与实现
  15. array_walk与array_map的区别
  16. 搭建C++环境
  17. Atlas &amp; mysql-proxy
  18. [转载]JVM 垃圾回收机制(Garbage Collection)
  19. 快速打开 Mac OS X 隐藏的用户资源库文件夹
  20. Eclipse关掉项目SVN的链接

热门文章

  1. 优雅地关闭worker进程
  2. Go语言之路—博客目录
  3. 《Python学习手册 第五版》 -第7章 字符串基础
  4. java10幸运抽奖
  5. Spring Cloud第十四篇 | Api网关Zuul
  6. 一起了解 .Net Foundation 项目 No.1
  7. 如何在kalilinux上安装docker
  8. 动态主机配置协议-DHCP
  9. javascript 浅复制 和 深复制
  10. RFC笔记—IP Version 6 Addressing Architecture