public class XssFilter implements Filter {
@Override
public void destroy() { } /**
* 过滤器用来过滤的方法
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 包装request
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
//实际设置
HttpServletResponse xssResponse = (HttpServletResponse) response;
xssResponse.setHeader("X-XSS-Protection", "1; mode=block");
xssResponse.setHeader("X-Frame-Options", "SAMEORIGIN");
xssResponse.setHeader("Strict-Transport-Security", "max-age=31536; includeSubDomains");
// xssResponse.setHeader("Content-Security-Policy", "default-src 'self'");
xssResponse.setHeader("X-Content-Type-Options", "nosniff");
chain.doFilter(xssRequest, xssResponse);
} @Override
public void init(FilterConfig filterConfig) throws ServletException { }
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
HttpServletRequest orgRequest = null; public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
} /**
* 覆盖getParameter方法,将参数名和参数值都做xss过滤。
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
*/
@Override
public String getParameter(String name) {
String value = super.getParameter(xssEncode(name));
if (value != null) {
value = xssEncode(value);
}
return value;
} @Override
public String[] getParameterValues(String name) {
String[] value = super.getParameterValues(name);
if (value != null) {
for (int i = ; i < value.length; i++) {
value[i] = xssEncode(value[i]);
}
}
return value;
} @SuppressWarnings("rawtypes")
@Override
public Map getParameterMap() {
return super.getParameterMap();
} /**
* 将容易引起xss漏洞的半角字符直接替换成全角字符 在保证不删除数据的情况下保存
*
* @param s
* @return 过滤后的值
*/
private static String xssEncode(String value) {
if (value == null || value.isEmpty()) {
return value;
}
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("<","&lt;");
value = value.replaceAll(">","&gt;");
value = value.replaceAll("'","&apos;");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
value = value.replaceAll("(?i)<script.*?>.*?<script.*?>", "");
value = value.replaceAll("(?i)<script.*?>.*?</script.*?>", "");
value = value.replaceAll("(?i)<.*?javascript:.*?>.*?</.*?>", "");
value = value.replaceAll("(?i)<.*?\\s+on.*?>.*?</.*?>", "");
// value = value.replaceAll("[<>{}\\[\\];\\&]","");
return value;
} /**
* 覆盖getHeader方法,将参数名和参数值都做xss过滤。 如果需要获得原始的值,则通过super.getHeaders(name)来获取
* getHeaderNames 也可能需要覆盖 这一段代码在一开始没有注释掉导致出现406错误,原因是406错误是HTTP协议状态码的一种,
* 表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。
**/
@Override
public String getHeader(String name) { String value = super.getHeader(xssEncode(name));
if (value != null) {
value = xssEncode(value);
}
return value;
} }
 <!--解决xss漏洞-->
<filter>
<filter-name>XssFilter</filter-name>
<filter-class>com.qls.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XssFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

  

最新文章

  1. css3 input边框蓝光特效
  2. HTML5 History API 实现无刷新跳转
  3. 一篇介绍java与js操作cookie的
  4. .net学习之路——调试程序
  5. php图片防盗链的小测试
  6. 开个坑, 写个阿里云开放储存服务(OSS)的C++版SDK以及客户端
  7. Xshell小技巧
  8. Selenium2学习-005-WebUI自动化实战实例-003-三种浏览器(Chrome、Firefox、IE)启动脚本源代码
  9. 通过ping确定网卡mtu
  10. 在linux下实现用ffmpeg把YUV420帧保存成图片
  11. iOS不越狱装收费App——注册iOS设备为开发者工具
  12. 高级PHP工程师所应该具备一些技能
  13. mybatis映射器配置细则
  14. spark2.1源码分析1:Win10下IDEA源码阅读环境的搭建
  15. 提取Chrome插件为crx文件
  16. Java中重写与重载
  17. net license tool, EasyLicense !
  18. MongoDB 教程(三):MongoDB 的下载、安装和配置
  19. JAVA工程师面试常见问题集锦
  20. JavaScript:如何获得 Private、Privileged、Public 和 Static 成员(属性和方法)【翻译+整理】

热门文章

  1. Altera FPGA AS,PS,Jtag配置模式区别
  2. Python最简编码规范
  3. django的htpp请求之WSGIRequest
  4. 0329--Scrum团队准备工作
  5. PSP DAILY软件功能说明书
  6. mysql You can&#39;t specify target table &#39;xxx&#39; for update in FROM clause
  7. A10
  8. HDU 5465 Clarke and puzzle Nim游戏+二维树状数组
  9. Oracle数据库表空间常用操作
  10. 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组