在前面的一篇文章中,讲到了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 {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void destroy() {

}

@Override

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

}

@Override

public 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

encodedValues[i] = stripXSS(values[i]);

}

return encodedValues;

}

@Override

public String getParameter(String parameter) {

String value = super.getParameter(parameter);

return stripXSS(value);

}

@Override

public 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 characters

value = value.replaceAll("", "");

// Avoid anything between script tags

Pattern 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­xpression

scriptPattern = 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  tag

scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE);

value = scriptPattern.matcher(value).replaceAll("");

// Remove any lonesome

scriptPattern = Pattern.compile("

value = scriptPattern.matcher(value).replaceAll("");

// Avoid eval(...) e­xpressions

scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

value = scriptPattern.matcher(value).replaceAll("");

// Avoid e­xpression(...) e­xpressions

scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

value = scriptPattern.matcher(value).replaceAll("");

// Avoid javascript:... e­xpressions

scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);

value = scriptPattern.matcher(value).replaceAll("");

// Avoid vbscript:... e­xpressions

scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);

value = scriptPattern.matcher(value).replaceAll("");

// Avoid οnlοad= e­xpressions

scriptPattern = 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 below

value = 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 攻击并不难,就是要小心。

java防止批量攻击_java 防止 XSS 攻击的常用方法总结相关推荐

  1. XSS跨站脚本攻击(DVWA XSS攻击详解、XSS平台搭建)

    一.跨站脚本攻击过程 二.XSS攻击定义及危害 三.XSS攻击常见分类 例:反射型 例:存储型 例:DOM型 四.XSS攻击常见编码 例: 编码后: 五.XSS常见测试语句 Script 标签 Scr ...

  2. 常见web攻击(sql注入,xss攻击,csrf攻击)

    sql注入攻击 危害 方式:通过表单提交加入特殊字符 如:' OR 1=1#' 防范:用django的ORM,就大可不必考虑这个问题,   如果自己写,要用正则和其他方式进行过滤 xss(Cross ...

  3. java jdbc 批量更新_java – JDBC PreparedStatement,批量更新和生成的密钥

    我在批处理中使用jdbc preparedStatement并尝试获取由此创建的生成密钥时出现问题. 代码 : PreparedStatement stmt = null; ... connectio ...

  4. java代码批量下载_Java代码实战:线程池实现批量下载文件

    今天技术之家陪你一起Java代码实战:线程池实现批量下载文件: 1 创建线程池package com.cheng.webb.thread; import java.util.concurrent.Ar ...

  5. java图片批量添加_java实现邮件中插入批量图片

    首先是MimeMessage这个类,继承于javax.mail.Message,底下还有IMAPMessage.POP3Message.SmartMimeMessage.SMTPMessage等实现, ...

  6. java 字节批量拷贝_Java基础回顾 : 利用字节流实现文件的拷贝

    本文是一个范例 : 利用字节流实现文件的拷贝 package example; /** * 文件的拷贝. */ import java.io.File; import java.io.FileInpu ...

  7. java ftp批量下载_java ftp连接一次下载多个文件

    展开全部 之前做的ftp连接下载的例子,62616964757a686964616fe78988e69d8331333337373539你试试!for (int i = 0; i String now ...

  8. java jdbc 批量更新_java,jdbc,大量数据update更新效率很慢,哪位大神可怜可怜我吧...

    数据库用的是mysql,部署在windows系统上.前提是不改变这两个条件.Stringsql="updatetableA=?,B=?,C=?whereD=?andE=?";字段D ...

  9. java 导出批量图片_Java Poi 导出excel(含图片及多个sheet)

    因为之前做的导出都是导出数据的基本信息不含图片的那种,一直也没做过导出图片的excel,正好这两天做这个需求就做了一个,好 废话不多说,直接上图 ,因为我这边是根据模板导出数据 先看下模板 然后上代码 ...

最新文章

  1. myeclipse-pro-2014-GA-offline-installer-windows 安装步骤 与安装效果预览
  2. 三种方式搭建yum源
  3. java中路径中参数化_Azure数据工厂:参数化文件夹和文件路径
  4. 前端性能优化之图像优化原理
  5. linux之tail 命令
  6. docker时区问题
  7. OpenStack精华问答 | OpenStack都有哪些基础服务?
  8. 种子接近,随机数也接近吗_接近代码,接近爸爸
  9. Timestamp 与 Date 变量绑定与Oracle的自动分区
  10. Oracle - SELECT 1 FROM table; SELECT COUNT(1) FROM table;
  11. 性能指标之速率、带宽、吞吐量
  12. Linux 性能分析工具 nmon for Linux
  13. echo输出不重复行到文件 shell_Shell脚本100例:43 shell中echo用法
  14. VB.NET 教程_01_基础语法
  15. k3 审核流程图_金蝶K3操作流程图详解(doc 64页)
  16. 贝壳如何docker安装openwrt_群晖Docker安装openwrt简单图文教程(黑白群晖均适用)...
  17. 华为手机解锁码计算工具_华为最新解bl解锁码读取工具
  18. 集丰照明|LED点光源安装方法
  19. 系统优化怎么做-开篇
  20. mac+safari+html5插件,打开 Mac Safari 黑色模式,这款插件有点厉害

热门文章

  1. 开源 | App 开发神仙工具:帮你抓 Bug
  2. 张似玫计算机系,计算机系举办“音律飞扬”卡拉OK大赛决赛
  3. kali 2020 ssh自启动_自动化所于2020年“国科大杯”创新创业大赛获得多项奖项
  4. 15-爬虫之scrapy框架基于管道实现数据库备份02
  5. php 一天只能点赞上一次,ThinkPHP3.2 实现浏览量和点赞量,每次访问页面浏览量+1以及每个登录用户只能对同一篇文章点赞一次-Go语言中文社区...
  6. ubuntu16.04安装R及RStudio
  7. 单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动
  8. 团队作业9——第二次项目冲刺2(Beta阶段)
  9. 不要在构造和析构函数中调用虚函数
  10. 学习spring之前必学之反射技术(IOC)(一)