java接口防止XSS攻击的常用方法总结
在前面的一篇文章中,讲到了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 expressionscriptPattern = 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(...) expressionsscriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid expression(...) expressionsscriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid javascript:... expressionsscriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid vbscript:... expressionsscriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid onload= expressionsscriptPattern = 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攻击的常用方法总结相关推荐
- java接口防止XSS攻击
java接口防止XSS攻击 一.什么是XSS 二.XSS攻击的主要途径 三.XSS攻击解决办法 四. 解决代码 1.配置过滤器 2.实现 ServletRequest 的包装类,过滤其他请求参数 3. ...
- java防止批量攻击_java 防止 XSS 攻击的常用方法总结
在前面的一篇文章中,讲到了java web应用程序防止 csrf 攻击的方法,参考这里java网页程序采用 spring 防止 csrf 攻击.,但这只是攻击的一种方式,还有其他方式,比如今天要记录的 ...
- java -xss_java 防止xss攻击
关于xss的概念和解决方案网上很多,可以参考这个: http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html#xsshappen ...
- java解决XSS攻击常用方法总结
前言 在项目验收阶段,通常会对待验收项目做一些安全漏洞的测试,比如接口攻击,并发测试,XSS注入,SQL恶意注入测试,安全越权等操作,这时,就是考验项目的安全方面是否做的足够健壮的时候,本篇对XSS脚 ...
- java 过滤攻击报文_Spring Boot XSS 攻击过滤插件使用
XSS 是什么 XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS ...
- java实现 XSS攻击防护
首先说一下什么是XSS攻击 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆, 故将跨站脚本攻击缩写为XSS,XSS是一种在web应用 ...
- Java接口xss,Java审计之XSS篇
Java审计之XSS篇 0x00 前言 继续 学习一波Java审计的XSS漏洞的产生过程和代码. 0x01 Java 中XSS漏洞代码分析 xss原理 xss产生过程: 后台未对用户输入进行检查或过滤 ...
- Java防止Xss注入json_浅谈 React 中的 XSS 攻击
作者:陈吉 转发链接:https://mp.weixin.qq.com/s/HweEFh78WXLawyQr_Vsl5g 前言 前端一般会面临 XSS 这样的安全风险,但随着 React 等现代前端框 ...
- Java 防止XSS攻击(Spring boot Spring 方式)
以下方式的pom依赖都基于hutool <dependency><groupId>cn.hutool</groupId><artifactId>huto ...
最新文章
- VMware与Hyper-V
- python冒泡排序算法时间复杂度为nlogn_Python版算法专题-1、冒泡排序
- MongoDB查询(上)
- 城市路(信息学奥赛一本通-T1381)
- ubuntu下kaldi的安装以及实例的运行
- 关于韩京清学者的《直线型倒立摆的自抗扰控制设计方案》仿真
- docker网络、bridge、host
- java 设置颜色_java 中怎样设置窗口的颜色
- 尔雅计算机基础答案山大,大学计算机基础2018尔雅满分答案
- python定时备份为知笔记数据
- adb+python实现自动领喵币
- 如何实现电脑时间与北京时间同步
- 如何恢复计算机中被隐藏的文件夹,电脑中病毒后,文件与文件夹被隐藏,如何恢复正常显示。...
- 深圳二手房房价分析与建模预测(附数据集)
- java 车牌号验证正则表达式_车牌号校验正则表达式
- PHP一码空传临时网盘源码2.0+带提取码模块
- 【课上笔记】第七章 树与森林
- 计蒜客NOIP模拟赛4 D2T1 鬼脚图
- 效果:mask-image 哔哩哔哩弹幕不遮挡人物
- ubuntu18.04+ros melodic环境下手柄驱动环境安装
热门文章
- RealityCapture 3D打印
- 5.4.1 jmeter组件—逻辑控制器-简单控制器、IF控制器、事务控制器、循环控制器、交替控制器
- gstreamer学习笔记---demux使用
- 二次优化问题dfp_最优化DFP算法报告
- Instant-ngp Windows11安装、使用记录
- 【趣学】C语言猜数字游戏
- 商户完成支付宝宝注册,3分钟快速生成支付宝扫码点餐小程序餐饮小程序
- 爱彼迎产品分析(Python)
- 业余草(www.xttblog.com)告诉你如何让网站网址实现百度秒收录
- Opencascade源码学习之模型数据——TKGeomBase模块文件介绍