java -xss_java 防止xss攻击

关于xss的概念和解决方案网上很多,可以参考这个:

http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html#xsshappen

这里说下最近项目中我们的解决方案,主要用到commons-lang3-3.1.jar这个包的org.apache.commons.lang3.StringEscapeUtils.escapeHtml4()这个方法。

解决过程主要在用户输入和显示输出两步:在输入时对特殊字符如<>" ' & 转义,在输出时用jstl的fn:excapeXml("fff")方法。

其中,输入时的过滤是用一个filter来实现,

实现过程:

在web.xml加一个filter

XssEscape

cn.pconline.morden.filter.XssFilter

XssEscape

/*

REQUEST

XssFilter 的实现方式是实现servlet的Filter接口

package cn.pconline.morden.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

public class XssFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);

}

@Override

public void destroy() {

}

}

关键是XssHttpServletRequestWrapper的实现方式,继承servlet的HttpServletRequestWrapper,并重写相应的几个有可能带xss攻击的方法,如:

package cn.pconline.morden.filter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang3.StringEscapeUtils;

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

public XssHttpServletRequestWrapper(HttpServletRequest request) {

super(request);

}

@Override

public String getHeader(String name) {

return StringEscapeUtils.escapeHtml4(super.getHeader(name));

}

@Override

public String getQueryString() {

return StringEscapeUtils.escapeHtml4(super.getQueryString());

}

@Override

public String getParameter(String name) {

return StringEscapeUtils.escapeHtml4(super.getParameter(name));

}

@Override

public String[] getParameterValues(String name) {

String[] values = super.getParameterValues(name);

if(values != null) {

int length = values.length;

String[] escapseValues = new String[length];

for(int i = 0; i < length; i++){

escapseValues[i] = StringEscapeUtils.escapeHtml4(values[i]);

}

return escapseValues;

}

return super.getParameterValues(name);

}

}

到此为止,在输入的过滤就完成了。

在页面显示数据的时候,只是简单地用fn:escapeXml()对有可能出现xss漏洞的地方做一下转义输出。

复杂内容的显示,具体问题再具体分析。

另外,有些情况不想显示过滤后内容的话,可以用StringEscapeUtils.unescapeHtml4()这个方法,把StringEscapeUtils.escapeHtml4()转义之后的字符恢复原样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提高java效率_提高Java编程效率的一个技巧

我们在用Eclipse等IDE进行Java开发时&#xff0c;对于复制、粘贴等操作&#xff0c;我们最常用的是CtrlC和CtrlV&#xff0c;甚至是用鼠标右键进行操作。其实效率最高的操作方式应该还是命令行或快捷键操作方式。编程界一个常见的现象就是凡是用命令行进行编程的人&#xff0c;…

java ftp 连接超时时间_ftpClient的连接超时设置(setConnectTimeout,setSoTimeout) | 学步园...

从 ftpClient的官方网的FAQ里面看到&#xff0c;实现这个需要用一个 自定义的SocketFactory然后实现里面的 createSocket方法&#xff0c;有好多个。http://wiki.apache.org/jakarta-commons/Net/FrequentlyAskedQuestions原文如下&#xff1a;Q: How can I set a connection t…

java break和return的区别_【java】break,continue和return区别

break&#xff1a;适用于switch和loopcontinue:只适用于loop两者都可以通过给循环加标签来控制跳出&#xff0c;如下例所示class BreakDemo{public static void main(String[] args){w:for (int i0; i<4; i) ##外for循环加标签{q:for(int m0;m<10;m)##内for循环加标签{Sy…

面试 java反射机制实现原理_面试官你要这么问我Java反射原理,我就笑了

引读&#xff1a;上周我投递出了简历&#xff0c;岗位是java后端开发工程师。这周美团面试官给我进行了面试&#xff0c;面试过程中他问了Java的反射原理。(不得不夸一句&#xff0c;美团的效率真高&#xff0c;上午面完一面&#xff0c;晚上二面马上安排上了。)无论什么Java技…

java 二叉堆_【数据结构】二叉堆:Java实现最大堆及堆排序

堆在逻辑上一棵完全二叉树&#xff0c;所以可以通过数组进行数据存储&#xff0c;而其余的树大多采用链式结构进行数据存储堆分类&#xff1a;大顶堆&#xff1a;大顶堆就是无论在任何一棵(子)树中&#xff0c;父节点都是最大的小顶堆&#xff1a;小顶堆就是无论在任何一棵(子)…

java int stack_java Stack的使用

堆栈是一种 “后进先出” (LIFO) 的数据结构&#xff0c; 只能在一端进行插入(称为 “压栈” ) 或删除 (称为“出栈”)数据的操作。所以很适合逆序操作&#xff0c;JAVA 中&#xff0c;使用 java.util.Stack 类的构造方法创建对象。Stack的基本方法1. public push (item )把项…

java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题

递归递归需要遵守的重要规则1) 执行一个方法时&#xff0c;就创建一个新的受保护的独立空间(栈空间)2) 方法的局部变量是独立的&#xff0c;不会相互影响, 比如 n 变量3) 如果方法中使用的是引用类型变量(比如数组)&#xff0c;就会共享该引用类型的数据.4) 递归 必须向退出递归…

java web 自定义异常_Java web, service 层应该通过异常(自定义Exception)来中断业务吗?...

同意&#xff01;但是不是最佳实践还有待商榷&#xff0c;我这里给出自己一直使用的用异常控制流程的方案&#xff0c;分享讨论一下吧。由于JAVA只能有一个返回值&#xff0c;但有时候一个service方法除了返回结果外还真的需要有一些附加信息&#xff0c;比如用户非法操作时要中…

java 数据字典 spring_springboot+redis+切面实现数据字典功能

自定义注解&#xff1a;DataDict&#xff0c;用于bo对象类&#xff0c;需要翻译的属性package com.zddts.common.annotation.dict;import java.lang.annotation.*;/*** 说明&#xff1a;数据字典处理类* Created by luojie on 2019/05/29.*///DataDict( dict"patType"…

java支持多线程吗_Java多线程之一

进程与线程进程进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位&#xff0c;比如我们windows电脑上运行的一个程序就是一个进程。在传统进程中进程是资源分配和调度的一个基本单位&#xff0c;在后来引入线程概念后&#xff0c;进程就变成了资源分…

java继承与多态性_Java继承与多态浅析

一、继承1、通过extends继承的父类可以是不加abstract关键字的普通类&#xff0c;也可以是加了abstract关键字的抽象类。继承普通类时可以覆写父类的方法&#xff0c;或者创建自己独有的方法&#xff0c;或者这两 者都不使用。继承抽象类时&#xff0c;必须覆写抽象类中的…

java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...

前言为什么需要去了解AQS&#xff0c;AQS&#xff0c;AbstractQueuedSynchronizer&#xff0c;即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等)&#xff0c;JUC并发包的作者(Doug Lea)期望它能够成为实现大部分同步…

java resttemplate_java-通过resttemplate通过Spring Rest服务发送文...

标题可能看起来很普通,但是没有一个适合我的问题.我有一个REST服务,它接受多部分形式的常规参数和文件.我想使用resttemplate将数据和文件发送到上述rest服务.直到我发送正常的字符串数据为止,没有任何问题.一旦我添加了发送字节的代码,那么我开始收到400错误的请求错误.如果我…

java中string的方法_java中String的常用方法

package com.string;public class string1 {public static void main(String args[]){//将char[]数组转换成Stringchar[] ch{h,我,是,中,国,人};String strnew String(ch);System.out.println(str); //结果为str"我是中国人"//将字符串转换为char数组,方法一使用getC…

Java是否为回文_java语言判断一个数字是否为回文数字

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为…

java floyd_百度百科里面的floyd算法java的代码,总是无法运行。请问是代码有问题吗,如何编译啊?...

展开全部不能编译运行的说法是错误&#xff0c;但是结果是否正确&#xff0c;我就32313133353236313431303231363533e59b9ee7ad9431333335303539不知道了&#xff0c;我不懂这个算法public class FLOYD {int[][] length null;// 任意两点之间路径长度int[][][] path null;// …

cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?

原标题&#xff1a;并发环境下&#xff0c;先操作数据库还是先操作缓存&#xff1f;来源&#xff1a;捡田螺的小男孩前言在分布式系统中&#xff0c;缓存和数据库同时存在时&#xff0c;如果有写操作&#xff0c;先操作数据库还是先操作缓存呢&#xff1f;本文将分5种方案 展开…

contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常

原因&#xff1a; crontab 没有去读环境变量&#xff0c;需要再脚本中手动引入环境变量&#xff0c;可以用source 也可以用export 写死环境变量。为了定时监控Linux系统CPU、内存、负载的使用情况&#xff0c;写了个Shell脚本&#xff0c;当达到一定值得时候&#xff0c;发送邮…

java的mybatis批量更新_mybatis批量更新的问题

一、问题描述场景描述&#xff1a;有这样一个service方法&#xff0c;调用了两个dao中的方法。第一个方法按照传入的id批量更新用户名。第二个dao方法无数据库操作&#xff0c;仅仅抛出一个RuntimeException.这个service方法通过xml配置由spring事务管理的。两个DAO类中分别有S…

java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器

一、方法一打印虚拟机所有参数[rootlocalhost ~]# java -XX:PrintFlagsFinal -version | grep :uintx InitialHeapSize : 258689024 {product}uintx MaxHeapSize : 4139778048 {product}bool PrintFlagsFinal : true {product}bool UseCompressedOops : true {lp64_product}boo…