XSS攻击及解决方案
什么是XSS攻击?
XSS攻击使用Javascript脚本注入进行攻击
XSS攻击常出现在提交表单中,如博客的评论区等,用户可以通过提交评论:,那么只要访问该页面的用户都会弹窗,当然,这可能是为了娱乐娱乐,不要小看XSS攻击,有些人利用XSS攻击窃取用户名密码,调用黑客的工程,将用户名和密码发送过去,也可以伪装成钓鱼网站。
例如在表单中注入: 那么页面会跳转到xxx.com
还可以根据js获取本地浏览器的cookie信息,根据cookie信息完全可以模拟用户。
那么该如何防止XSS攻击呢?
实现思路:
使用转义解决。将<转义为< >转义为>
①使用过滤器,拦截所有请求,重写request
②重写获取值的方法,将特殊代码转换成html
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;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;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;import com.jeecms.core.web.util.URLHelper;public class XssFilter implements Filter {/*** 排除链接*/public List<String> excludes = new ArrayList<String>();private String filterChar;private String replaceChar;private String splitChar;private String excludeUrls;FilterConfig filterConfig = null;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.filterChar=filterConfig.getInitParameter("FilterChar");this.replaceChar=filterConfig.getInitParameter("ReplaceChar");this.splitChar=filterConfig.getInitParameter("SplitChar");this.excludeUrls=filterConfig.getInitParameter("excludeUrls");this.filterConfig = filterConfig;}@Overridepublic void destroy() {this.filterConfig = null;}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;if (handleExcludeURL(req, resp)){chain.doFilter(request, response);return;}XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request,filterChar,replaceChar,splitChar);chain.doFilter(xssRequest, response);}private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response){if (excludes == null || excludes.isEmpty()){return false;}String url = request.getServletPath();for (String pattern : excludes){Pattern p = Pattern.compile("^" + pattern);Matcher m = p.matcher(url);if (m.find()){return true;}}return false;}private boolean isExcludeUrl(ServletRequest request){boolean exclude=false;if(StringUtils.isNotBlank(excludeUrls)){String[]excludeUrl=excludeUrls.split(splitChar);if(excludeUrl!=null&&excludeUrl.length>0){for(String url:excludeUrl){if(URLHelper.getURI((HttpServletRequest)request).startsWith(url)){exclude=true;}}}}return exclude;}}
import static com.jeecms.common.web.Constants.UTF8;import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;/*** @author Tom*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {private String[]filterChars;private String[]replaceChars;public XssHttpServletRequestWrapper(HttpServletRequest request,String filterChar,String replaceChar,String splitChar) {super(request);if(filterChar!=null&&filterChar.length()>0){filterChars=filterChar.split(splitChar);}if(replaceChar!=null&&replaceChar.length()>0){replaceChars=replaceChar.split(splitChar);}}@Overridepublic String getQueryString() {String value = super.getQueryString();if (value != null) {value = xssEncode(value);}return value;}/*** 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖*/@Overridepublic String getParameter(String name) {String value = super.getParameter(xssEncode(name));if (value != null) {value = xssEncode(value);}return value;}@Overridepublic String[] getParameterValues(String name) {String[]parameters=super.getParameterValues(name);if (parameters==null||parameters.length == 0) {return null;}for (int i = 0; i < parameters.length; i++) {parameters[i] = xssEncode(parameters[i]);}return parameters;}/*** 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>* 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/> getHeaderNames 也可能需要覆盖*/@Overridepublic String getHeader(String name) {String value = super.getHeader(xssEncode(name));if (value != null) {value = xssEncode(value);}return value;}/*** 将容易引起xss漏洞的半角字符直接替换成全角字符* 请求的参数过滤一些关键字* @return*/private String xssEncode(String s) {if (s != null) {// 避免 null 字符s = s.replaceAll("", "");s = s.replaceAll("<", "& lt;").replaceAll(">", "& gt;");s = s.replaceAll("<", "& lt;").replaceAll(">", "& gt;");// 全角大于号 全角小于号s = s.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");// \\( \\)s = s.replaceAll("'", "& #39;");s = s.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");s = s.replaceAll("alert", "");s = s.replaceAll("script", "");s = s.replaceAll("#", "#");s = s.replaceAll("%", "%");}if (s == null || s.equals("")) {return s;}try {s = URLDecoder.decode(s, UTF8);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}for (int i = 0; i < filterChars.length; i++) {if(s.contains(filterChars[i])){s=s.replace(filterChars[i], replaceChars[i]);}}return s;}}
web.xml配置过滤器
<!-- 防止XSS攻击 --><filter><filter-name>FilterXSS</filter-name><filter-class>cn.itcats.FilterXSS</filter-class></filter><filter-mapping><filter-name>FilterXSS</filter-name><url-pattern>/*</url-pattern></filter-mapping>
XSS攻击及解决方案相关推荐
- 安全测试之xss攻击和mysql注入
xss概念: xss(Cross Site Script)跨站脚本攻击,为不和层叠样式表(css)混淆,写为xss 存在位置:web应用系统最常见软件安全漏洞 后果:代码植入到系统页面,篡改数据.盗取 ...
- 使用 PHP 构建的 Web 应用如何避免 XSS 攻击
本文首先简单介绍开发测试人员如何对 Web 应用进行 XSS 漏洞测试,如何借助工具绕过客户端 JavaScript 校验输入恶意数据:然后针对使用 PHP 语言构建的 Web 站点,从在输出端对动态 ...
- [绍棠] Vue解决V-HTML指令潜在的XSS攻击(‘v-html‘ directive can lead to XSS attack.)
什么是 XSS 攻击? XSS是跨站脚本攻击(Cross-Site Scripting)的简称. XSS是一种注入脚本式攻击,攻击者利用如提交表单.发布评论等方式将事先准备好的恶意脚本注入到那些良性可 ...
- 互联网安全架构平台设计之预防XSS攻击
互联网安全架构平台设计之预防XSS攻击 文章目录 互联网安全架构平台设计之预防XSS攻击 一.什么是XSS攻击? 二.XSS攻击详解 1.XSS攻击的原理 2.解决方案 三.注意事项 一.什么是XSS ...
- php的服务器变量$SERVER以及防止$_SERVER['PHP_SELF']造成的XSS漏洞攻击及其解决方案
一.背景 突然想起来之前面试的一些面试题,让我写出几个服务器变量$SERVER代表的意思..实话实说,这些东西已经忘记很久了,都是用的时候直接上网查,今天再复习复习吧. 二.$SERVER $_SER ...
- XSS(跨站脚本攻击)漏洞解决方案
XSS(跨站脚本攻击)漏洞解决方案 参考文章: (1)XSS(跨站脚本攻击)漏洞解决方案 (2)https://www.cnblogs.com/boboxing/p/9261996.html 备忘一下 ...
- AntiSamy:防 XSS 攻击的一种解决方案使用教程
AntiSamy:防 XSS 攻击的一种解决方案使用教程 1. XSS 介绍 2. AntiSamy 介绍 3. AntiSamy 使用 3.1 导入依赖 3.2 选择策略文件 3.3 SpringB ...
- 防止XSS漏洞攻击常用解决方案
漏洞通用描述 跨站脚本攻击(Cross Site Scripting),简称XSS漏洞. 该页面直接将用户在 HTML 页面中的输入(通常是参数值)加载到前端页面,没有预先加以清理. 如果脚本在响应页 ...
- xss攻击解决方案php项目,php 过滤存储型XSS攻击,_PHP_ 少侠科技
详细内容 最近做的项目被测试测出了存在存储型XSS,至此记录一下,问题出在了 input 框 :payload:"a" οnclick=alert(1)> 也做了一些XSS过 ...
最新文章
- OpenCV代码提取:Windows上通过DShow获取Camera视频
- 自己动手写第一阶段的处理器(1)——计算机的简单模型、架构、指令系统
- MySQL Replication--复制异常1
- getplotlyoffline(‘http://cdn.plot.ly/plotly-latest.min.js‘)无法下载如何解决
- MapReduce异常
- matlab拉普拉斯算子边缘提取_使用平面光学器件进行图像边缘的差分检测
- 大数据Hadoop简介
- C语言齿轮参数计算程序,C语言程序实现齿轮基本参数几何尺寸计算.pdf
- kb4023057安装失败_微软重发KB4023057补丁致部分用户更新失败
- 程序员,你准备好回家过年了吗?
- Activiti6.0.0及以上版本集成Activiti Modeler
- 切片器可以设置日期格式?_如何分秒必争浅淡时间切片器
- 问题:阿里云RDS数据库Binlog日志一直增大,撑爆磁盘
- Hive自定义函数(字母大小写转换)
- easycode配置问题
- Android WebView支持文件下载之调起浏览器下载(Java与Kotlin版)
- 生成对抗网络——GAN(一)
- 点成分享| 低温冷冻保存的技术研究(一)
- 小区规划开发商想妻子的谎言改就能改(图)2015年05月02
- 监控平台服务器是什么系统,监控平台系统服务器的作用
热门文章
- 使用JUnit测试预期异常
- 2021年营销数智化趋势洞察报告:深链经营孕育品牌发展新商机.pdf(附下载链接)...
- 【报告分享】2021年中国企业直播成长路径研究报告.pdf(附下载链接)
- 16篇最新推荐系统论文送你(文末附打包下载链接)
- PyTorch 深度学习:32分钟快速入门——DenseNet
- 假如BERT系论文变成Commit History
- NLP简报(Issue#7)
- 深度学习训练出来的损失不收敛_学习率设置技巧,使用学习率来提升我们的模型...
- 怎样设置电脑壁纸_谷歌地球实时壁纸,电脑和手机实现方案都在这里了
- Leetcode每日一题:52.N-Queens II(N皇后Ⅱ)