Java过滤XSS脚本, 可通过Appscan扫描

项目中有时会需要把一些报错或者解决方案直接返回给前端,

如果直接返回原字符串, 可能会被恶意传参来实现xss注入.

例如常规业务访问一个页面读取文件&file=sdf.cpt,

如果文件不存在, 则页面返回没有找到sdf.cpt的报错.

恶意传参即: &file=sdf.cpt<script>alert(123);</script>, 这样页面会alert出来123;

这时需要我们在后台对于一些报错进行去脚本话.

一开始是用的正则, 后来发现可以注入的脚本方式太多了, 用正则越来越长. 

1 &file=/doc/Advanced/Chart/LineChart/%E5%AE%9A%E6%97%B6%E5%88%B7%E6%96%B0%E6%8A%98%E7%BA%BF%E5%9B%BE.cpt'%20STYLE='xss:e/**/xpression(try{a=firstTime}catch(e){firstTime=1;alert(9178)});
1 &file=emb%3Ciframe+src%3Djavascript%3Aalert%2898%29+

索性直接采用最简单粗暴的字符串替换了, 把html实体编码,特殊字符如()<>/,例如> 编成&gt; <编成&lt;

这样显示起来没有问题,也不会导致用户输入的js语句被插入到输出页面而被执行.

改完用Appscan扫了下, 也不会提示xss漏洞. Spring中也提供了类似的方法HtmlUtils.htmlEscape.

 1     private static String encodeHtml(String strInput) {
 2         if (StringUtils.isEmpty(strInput)) {
 3             return StringUtils.EMPTY;
 4         }
 5         StringBuffer builder = new StringBuffer(strInput.length() * 2);
 6         CharacterIterator it = new StringCharacterIterator(strInput);
 7         for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
 8             if ((((ch > '`') && (ch < '{')) || ((ch > '@') && (ch < '[')))
 9                     || (((ch == ' ') || ((ch > '/') && (ch < ':'))) || (((ch == '.') || (ch == ',')) || ((ch == '-') || (ch == '_'))))) {
10                 builder.append(ch);
11             } else {
12                 builder.append("&#" + (int) ch + ";");
13             }
14         }
15         return builder.toString();
16     }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术点滴

程序异常分析指南一、非法内存访问二、资源访问冲突三、程序异常解决方法总结参考资料

在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异常的情况。程序崩溃时最常见的就是程序运行终止,报告Segmentation fault (core...

62230
来自专栏python3

python3--线程,锁,同步锁,递归锁,信号量,事件,条件和定时器,队列,线程池

这个99又赋值给n,进程变量就是99,所以每次都是赋值操作,赋值了100次,最终结果99,这样还是出现数据不安全的情况

75120
来自专栏Java编程技术

高并发编程必备基础(上)

借用Java并发编程实践中的话"编写正确的程序并不容易,而编写正常的并发程序就更难了",相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没...

10620
来自专栏栗霖积跬步之旅

java多线程编程核心技术——第一章总结 1.5sleep()方法

1.1进程、多线程的概念及线程的优点 进程的概念: 百度百科讲解: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和...

216100
来自专栏Android-JessYan

你不知道的Retrofit缓存库RxCache前言简介使用详解总结

21320
来自专栏SeanCheney的专栏

《Python分布式计算》 第3章 Python的并行计算 (Distributed Computing with Python)多线程多进程多进程队列一些思考总结

我们在前两章提到了线程、进程,还有并发编程。我们在很高的层次,用抽象的名词,讲了如何组织代码,已让其部分并发运行,在多个CPU上或在多台机器上。 本章中,我们会...

58760
来自专栏蓝天

细节决定品质:不良的if/else使用习惯

这个时候应当考虑提取成函数调用,以减少直接的if/else嵌套层次。同理,while/for也应当避免这种情况。

9810
来自专栏小狼的世界

PHP手册阅读笔记

学习PHP以来一直希望有时间能够有时间通读PHP手册,最近终于强迫自己划出一些时间,完成了对PHP手册的通读。除了函数参考部分没有每个都看,其他的章节基本上都看...

19640
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第9章 轻量级线程:协程(2)《Kotlin极简教程》正式上架:

如果需要依次调用它们, 我们只需要使用正常的顺序调用, 因为协同中的代码 (就像在常规代码中一样) 是默认的顺序执行。下面的示例通过测量执行两个挂起函数所需的总...

14120
来自专栏别先生

JSch - Java实现的SFTP(文件上传详解篇)

  JSch是Java Secure Channel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11...

1.2K10

扫码关注云+社区

领取腾讯云代金券