博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java防止XSS攻击
阅读量:4683 次
发布时间:2019-06-09

本文共 6658 字,大约阅读时间需要 22 分钟。

方法一:转义存储:添加XssFilter 

1.在web.xml添加过滤器:

xssFilter
XXXXXX.XssFilter
xssFilter
*

2.添加XssFilter

public class XssFilter implements Filter{    @Override    public void init(FilterConfig filterConfig) {    }    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        //使用包装器        XssFilterWrapper xssFilterWrapper=new XssFilterWrapper((HttpServletRequest) servletRequest);        filterChain.doFilter(xssFilterWrapper,servletResponse);    }    @Override    public void destroy() {    }}

3、添加 XssFilterWrapper.java类

public class XssFilterWrapper  extends HttpServletRequestWrapper {    public XssFilterWrapper(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);    }}

自此,即能实现,

假如在网站的文本框输入<script>alert("OK");</script>,

提交到数据库后保存的数据为:&amp;lt;script&amp;gt;alert(&amp;quot;OK&amp;quot;);&amp;lt;/script&amp;gt;

 

二、

1.添加XssFilter ,(同上)

2..添加XssHttpServletRequestWrapper.java类

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {    /**     * Constructs a request object wrapping the given request.     *     * @param request The request to wrap     * @throws IllegalArgumentException if the request is null     */    public XssHttpServletRequestWrapper(HttpServletRequest request) {        super(request);    }    @Override    public String getHeader(String name) {        String value = super.getHeader(name);        if(StringUtils.isEmpty(value)){            return value;        }        else{            return cleanXSS(value);        }    }    @Override    public String getParameter(String name) {        String value = super.getParameter(name);        if(StringUtils.isEmpty(value)){            return value;        }        else{            return cleanXSS(value);        }    }    @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] = cleanXSS(values[i]);            }            return escapseValues;        }        return super.getParameterValues(name);    }    @Override    public ServletInputStream getInputStream() throws IOException {        String str=getRequestBody(super.getInputStream());        Map
map= JSON.parseObject(str,Map.class); Map
resultMap=new HashMap<>(); for(String key:map.keySet()){ Object val=map.get(key); if(map.get(key) instanceof String){ resultMap.put(key,cleanXSS(val.toString())); } else{ resultMap.put(key,val); } } str=JSON.toJSONString(resultMap); final ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes()); return new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener listener) { } }; } private String getRequestBody(InputStream stream) { String line = ""; StringBuilder body = new StringBuilder(); int counter = 0; // 读取POST提交的数据内容 BufferedReader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF-8"))); try { while ((line = reader.readLine()) != null) { body.append(line); counter++; } } catch (IOException e) { e.printStackTrace(); } return body.toString(); } private String cleanXSS(String value) { if(StringUtils.isEmpty(value)){ return value; } else{ if (value != null) { 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

两种方法,原理一致只是写法不一样,

第二种写法保存到数据库为:scriptalert("OK");/script

 

转载于:https://www.cnblogs.com/xiaoyongsz/p/10940308.html

你可能感兴趣的文章
c# static 常量
查看>>
for循环:用turtle画一颗五角星
查看>>
子组件向父组件传递信息
查看>>
winform无需安装pdf阅读器打开pdf文件
查看>>
html(二) -- 文本标签和实体字符
查看>>
python基础(一)
查看>>
UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转...
查看>>
linux 使用NSF 映射远程磁盘目录
查看>>
elasticjob 当当的分布式定时任务管理
查看>>
BZOJ 3438: 小M的作物( 最小割 )
查看>>
js性能优化-事件委托(2)
查看>>
Determine File Output Location
查看>>
51NOD 1068 Bash游戏 V3
查看>>
级联。。。
查看>>
socketserver用法列子
查看>>
网站链接被微信屏蔽拦截了怎么办?VJump帮你解除屏蔽
查看>>
[操作系统实验lab2]实验报告
查看>>
monkeyrunner学习笔记(1)- monkeyrunner入门
查看>>
插入排序(C#实现)
查看>>
eclipse中maven读取Excel文件内容
查看>>