在前面的一篇文章中,讲到了java web应用程序防止 csrf 攻击的方法,参考这里 java网页程序采用 spring 防止 csrf 攻击. ,但这只是攻击的一种方式,还有其他方式,比如今天要记录的 XSS 攻击, XSS 攻击的专业解释,可以在网上搜索一下,参考百度百科的解释 http://baike.baidu.com/view/2161269.htm, 但在实际的应用中如何去防止这种攻击呢,下面给出几种办法.
1. 自己写 filter 拦截来实现,但要注意的时,在WEB.XML 中配置 filter 的时候,请将这个 filter 放在第一位.
2. 采用开源的实现 ESAPI library ,参考网址:https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

3. 可以采用spring 里面提供的工具类来实现.

一, 第一种方法。
配置过滤器

public class XSSFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);}
}

再实现 ServletRequest 的包装类

import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class XSSRequestWrapper extends HttpServletRequestWrapper {public XSSRequestWrapper(HttpServletRequest servletRequest) {super(servletRequest);}@Overridepublic String[] getParameterValues(String parameter) {String[] values = super.getParameterValues(parameter);if (values == null) {return null;}int count = values.length;String[] encodedValues = new String[count];for (int i = 0; i < count; i++) {encodedValues[i] = stripXSS(values[i]);}return encodedValues;}@Overridepublic String getParameter(String parameter) {String value = super.getParameter(parameter);return stripXSS(value);}@Overridepublic String getHeader(String name) {String value = super.getHeader(name);return stripXSS(value);}private String stripXSS(String value) {if (value != null) {// NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to// avoid encoded attacks.// value = ESAPI.encoder().canonicalize(value);// Avoid null charactersvalue = value.replaceAll("", "");// Avoid anything between script tagsPattern scriptPattern = Pattern.compile("(.*?)", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid anything in a src="http://www.yihaomen.com/article/java/..." type of e­xpressionscriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome  tagscriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome  tagscriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid eval(...) e­xpressionsscriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid e­xpression(...) e­xpressionsscriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid javascript:... e­xpressionsscriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid vbscript:... e­xpressionsscriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid onload= e­xpressionsscriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");}return value;}
}

例子中注释的部分,就是采用 ESAPI library 来防止XSS攻击的,推荐使用.

当然,我还看到这样一种办法,将所有的编程全角字符的解决方式,但个人觉得并没有上面这种用正则表达式替换的好

private static String xssEncode(String s) {if (s == null || s.equals("")) {return s;}StringBuilder sb = new StringBuilder(s.length() + 16);for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);switch (c) {case '>':sb.append('>');// 全角大于号break;case '<':sb.append('<');// 全角小于号break;case '\'':sb.append('\\');sb.append('\'');sb.append('\\');sb.append('\'');break;case '\"':sb.append('\\');sb.append('\"');// 全角双引号break;case '&':sb.append('&');// 全角break;case '\\':sb.append('\');// 全角斜线break;case '#':sb.append('#');// 全角井号break;case ':':sb.append(':');// 全角冒号break;case '%':sb.append("\\\\%");break;default:sb.append(c);break;}}return sb.toString();}

当然,还有如下更简单的方式:

private String cleanXSS(String value) {//You'll need to remove the spaces from the html entities belowvalue = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");value = value.replaceAll("'", "& #39;");value = value.replaceAll("eval\\((.*)\\)", "");value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");value = value.replaceAll("script", "");return value;}

在后台或者用spring 如何实现呢:
首先添加一个jar包:commons-lang-2.5.jar ,然后在后台调用这些函数:

StringEscapeUtils.escapeHtml(string);
StringEscapeUtils.escapeJavaScript(string);
StringEscapeUtils.escapeSql(string);

当然,我记得在spring 里面好像有一个 HtmlUtils.htmlEscape , 同样可以做到 过滤 XSS 攻击。从上面的介绍可以看出,防止 XSS 攻击并不难,就是要小心。

以上内容转自https://blog.csdn.net/joeyon1985/article/details/43527987


以下是我们项目中使用的替换XSS敏感字符的公用方法:

 private static final String[] dangerCharacters = {"<",">","\"","\'","%","(",")","\\", "."};public static String filterParameter(String parameter){if(StringUtils.isEmpty(parameter))return null;StringBuffer sb = new StringBuffer(parameter);for(String s : dangerCharacters){while(sb.indexOf(s) > -1){sb.deleteCharAt(sb.indexOf(s));}}return sb.toString();}

java接口防止XSS攻击的常用方法总结相关推荐

  1. java接口防止XSS攻击

    java接口防止XSS攻击 一.什么是XSS 二.XSS攻击的主要途径 三.XSS攻击解决办法 四. 解决代码 1.配置过滤器 2.实现 ServletRequest 的包装类,过滤其他请求参数 3. ...

  2. java防止批量攻击_java 防止 XSS 攻击的常用方法总结

    在前面的一篇文章中,讲到了java web应用程序防止 csrf 攻击的方法,参考这里java网页程序采用 spring 防止 csrf 攻击.,但这只是攻击的一种方式,还有其他方式,比如今天要记录的 ...

  3. java -xss_java 防止xss攻击

    关于xss的概念和解决方案网上很多,可以参考这个: http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html#xsshappen ...

  4. java解决XSS攻击常用方法总结

    前言 在项目验收阶段,通常会对待验收项目做一些安全漏洞的测试,比如接口攻击,并发测试,XSS注入,SQL恶意注入测试,安全越权等操作,这时,就是考验项目的安全方面是否做的足够健壮的时候,本篇对XSS脚 ...

  5. java 过滤攻击报文_Spring Boot XSS 攻击过滤插件使用

    XSS 是什么 XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS ...

  6. java实现 XSS攻击防护

    首先说一下什么是XSS攻击 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆, 故将跨站脚本攻击缩写为XSS,XSS是一种在web应用 ...

  7. Java接口xss,Java审计之XSS篇

    Java审计之XSS篇 0x00 前言 继续 学习一波Java审计的XSS漏洞的产生过程和代码. 0x01 Java 中XSS漏洞代码分析 xss原理 xss产生过程: 后台未对用户输入进行检查或过滤 ...

  8. Java防止Xss注入json_浅谈 React 中的 XSS 攻击

    作者:陈吉 转发链接:https://mp.weixin.qq.com/s/HweEFh78WXLawyQr_Vsl5g 前言 前端一般会面临 XSS 这样的安全风险,但随着 React 等现代前端框 ...

  9. Java 防止XSS攻击(Spring boot Spring 方式)

    以下方式的pom依赖都基于hutool <dependency><groupId>cn.hutool</groupId><artifactId>huto ...

最新文章

  1. VMware与Hyper-V
  2. python冒泡排序算法时间复杂度为nlogn_Python版算法专题-1、冒泡排序
  3. MongoDB查询(上)
  4. 城市路(信息学奥赛一本通-T1381)
  5. ubuntu下kaldi的安装以及实例的运行
  6. 关于韩京清学者的《直线型倒立摆的自抗扰控制设计方案》仿真
  7. docker网络、bridge、host
  8. java 设置颜色_java 中怎样设置窗口的颜色
  9. 尔雅计算机基础答案山大,大学计算机基础2018尔雅满分答案
  10. python定时备份为知笔记数据
  11. adb+python实现自动领喵币
  12. 如何实现电脑时间与北京时间同步
  13. 如何恢复计算机中被隐藏的文件夹,电脑中病毒后,文件与文件夹被隐藏,如何恢复正常显示。...
  14. 深圳二手房房价分析与建模预测(附数据集)
  15. java 车牌号验证正则表达式_车牌号校验正则表达式
  16. PHP一码空传临时网盘源码2.0+带提取码模块
  17. 【课上笔记】第七章 树与森林
  18. 计蒜客NOIP模拟赛4 D2T1 鬼脚图
  19. 效果:mask-image 哔哩哔哩弹幕不遮挡人物
  20. ubuntu18.04+ros melodic环境下手柄驱动环境安装

热门文章

  1. RealityCapture 3D打印
  2. 5.4.1 jmeter组件—逻辑控制器-简单控制器、IF控制器、事务控制器、循环控制器、交替控制器
  3. gstreamer学习笔记---demux使用
  4. 二次优化问题dfp_最优化DFP算法报告
  5. Instant-ngp Windows11安装、使用记录
  6. 【趣学】C语言猜数字游戏
  7. 商户完成支付宝宝注册,3分钟快速生成支付宝扫码点餐小程序餐饮小程序
  8. 爱彼迎产品分析(Python)
  9. 业余草(www.xttblog.com)告诉你如何让网站网址实现百度秒收录
  10. Opencascade源码学习之模型数据——TKGeomBase模块文件介绍