解决反射型XSS漏洞攻击

对于程序员来说安全防御,无非从两个方面考虑,要么前端要么后台。

一、首先从前端考虑过滤一些非法字符。

前端的主控js中,在<textarea> 输入框标签中,
找到点击发送按钮后,追加到聊天panel前 进行过滤Input输入内容

 1         // 过滤XSS反射型漏洞
 2         filterInputTxt: function (html) {
 3             html = html.replace(/(.*<[^>]+>.*)/g,"");    // HTML标记
 4             html = html.replace(/([\r\n])[\s]+/g, "");    // 换行、空格
 5             html = html.replace(/<!--.*-->/g, "");    // HTML注释
 6             html = html.replace(/[‘"‘’“”!@#$%^&*{}!¥()()×+=]/g, ""); // 非法字符
 7             html = html.replace("alert","");
 8             html = html.replace("eval","");
 9             html = html.replace(/(.*javascript.*)/gi,"");
10             if (html === "") {
11                 html = "你好";
12             }
13             return html;
14         }

二、在后台API服务解决反射型XSS漏洞

thinking:一般来说前端可以过滤一下基本的非法恶意代码攻击,如果恶意脚本被请求到服务端啦,那么就需要请求参数未请求接口前进行过滤一些非法字符。

handle:1、自定义过滤器实现Filter接口

    2、在doFilter方法中对request、response进行设置处理

##处理request请求参数。

  1 /*
  2  * Copyright (C), 2001-2019, xiaoi机器人
  3  * Author:   han.sun
  4  * Date:     2019/2/28 11:39
  5  * History:
  6  * <author>          <time>          <version>         <desc>
  7  * 作者姓名          修改时间          版本号            描述
  8  */
  9 package com.eastrobot.robotdev.filter;
 10
 11 import javax.servlet.http.HttpServletRequest;
 12 import javax.servlet.http.HttpServletRequestWrapper;
 13 import java.util.Map;
 14 import java.util.regex.Matcher;
 15 import java.util.regex.Pattern;
 16
 17 /**
 18  * 〈一句话功能简述〉<br>
 19  * TODO(解决反射型XSS漏洞攻击)
 20  *
 21  * @author han.sun
 22  * @version 1.0.0
 23  * @since 2019/2/28 11:39
 24  */
 25 public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
 26
 27     /**
 28      * 定义script的正则表达式
 29      */
 30     private static final String REG_SCRIPT = "<script[^>]*?>[\\s\\S]*?</script>";
 31
 32     /**
 33      * 定义style的正则表达式
 34      */
 35     private static final String REG_STYLE = "<style[^>]*?>[\\s\\S]*?</style>";
 36
 37     /**
 38      * 定义HTML标签的正则表达式
 39      */
 40     private static final String REG_HTML = "<[^>]+>";
 41
 42     /**
 43      * 定义所有w标签
 44      */
 45     private static final String REG_W = "<w[^>]*?>[\\s\\S]*?</w[^>]*?>";
 46
 47     private static final String REG_JAVASCRIPT = ".*javascript.*";
 48
 49
 50     XssHttpServletRequestWrapper(HttpServletRequest request) {
 51         super(request);
 52     }
 53
 54     @SuppressWarnings("rawtypes")
 55     @Override
 56     public Map<String, String[]> getParameterMap() {
 57         Map<String, String[]> requestMap = super.getParameterMap();
 58         for (Object o : requestMap.entrySet()) {
 59             Map.Entry me = (Map.Entry) o;
 60             String[] values = (String[]) me.getValue();
 61             for (int i = 0; i < values.length; i++) {
 62                 values[i] = xssClean(values[i]);
 63             }
 64         }
 65         return requestMap;
 66     }
 67
 68     @Override
 69     public String[] getParameterValues(String paramString) {
 70         String[] values = super.getParameterValues(paramString);
 71         if (values == null) {
 72             return null;
 73         }
 74         int i = values.length;
 75         String[] result = new String[i];
 76         for (int j = 0; j < i; j++) {
 77             result[j] = xssClean(values[j]);
 78         }
 79         return result;
 80     }
 81
 82     @Override
 83     public String getParameter(String paramString) {
 84         String str = super.getParameter(paramString);
 85         if (str == null) {
 86             return null;
 87         }
 88         return xssClean(str);
 89     }
 90
 91
 92     @Override
 93     public String getHeader(String paramString) {
 94         String str = super.getHeader(paramString);
 95         if (str == null) {
 96             return null;
 97         }
 98         str = str.replaceAll("[\r\n]", "");
 99         return xssClean(str);
100     }
101
102     /**
103      * [xssClean 过滤特殊、敏感字符]
104      * @param  value [请求参数]
105      * @return       [value]
106      */
107     private String xssClean(String value) {
108         if (value == null || "".equals(value)) {
109             return value;
110         }
111         Pattern pw = Pattern.compile(REG_W, Pattern.CASE_INSENSITIVE);
112         Matcher mw = pw.matcher(value);
113         value = mw.replaceAll("");
114
115         Pattern script = Pattern.compile(REG_SCRIPT, Pattern.CASE_INSENSITIVE);
116         value = script.matcher(value).replaceAll("");
117
118         Pattern style = Pattern.compile(REG_STYLE, Pattern.CASE_INSENSITIVE);
119         value = style.matcher(value).replaceAll("");
120
121         Pattern htmlTag = Pattern.compile(REG_HTML, Pattern.CASE_INSENSITIVE);
122         value = htmlTag.matcher(value).replaceAll("");
123
124         Pattern javascript = Pattern.compile(REG_JAVASCRIPT, Pattern.CASE_INSENSITIVE);
125         value = javascript.matcher(value).replaceAll("");
126         return value;
127     }
128
129 }

##自定义Filter过滤器。

 1 /*
 2  * Copyright (C), 2001-2019, xiaoi机器人
 3  * Author:   han.sun
 4  * Date:     2019/2/28 11:38
 5  * History:
 6  * <author>          <time>          <version>         <desc>
 7  * 作者姓名          修改时间          版本号            描述
 8  */
 9 package com.eastrobot.robotdev.filter;
10
11 import javax.servlet.*;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 import java.io.IOException;
15
16 /**
17  * 〈在服务器端对 Cookie 设置了HttpOnly 属性,
18  * 那么js脚本就不能读取到cookie,
19  * 但是浏览器还是能够正常使用cookie〉<br>
20  * TODO(禁用js脚步读取用户浏览器中的Cookie)
21  *
22  * @author han.sun
23  * @version 1.0.0
24  * @since 2019/2/28 16:38
25  */
26 public class XssFilter implements Filter {
27
28     @Override
29     public void init(FilterConfig filterConfig) throws ServletException {
30
31     }
32
33     @Override
34     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
35
36         HttpServletRequest req = (HttpServletRequest) request;
37         HttpServletResponse resp = (HttpServletResponse) response;
38
39         // 解决动态脚本获取网页cookie,将cookie设置成HttpOnly
40         String sessionId = req.getSession().getId();
41         resp.setHeader("SET-COOKIE", "JSESSIONID=" + sessionId + "; HttpOnly");
42         resp.setHeader("x-frame-options", "SAMEORIGIN");
43
44         chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);
45     }
46
47     @Override
48     public void destroy() {
49     }
50 }

需要在web.xml文件中添加自定义过滤器映射,让其起作用

1 <filter>
2 <filter-name>XssEscape</filter-name>
3 <filter-class>com.eastrobot.robotdev.filter.XssFilter</filter-class>
4 </filter>
5 <filter-mapping>
6 <filter-name>XssEscape</filter-name>
7 <url-pattern>/*</url-pattern>
8 </filter-mapping>

原文地址:https://www.cnblogs.com/han-sun/p/10463834.html

时间: 2024-10-07 18:39:32

解决反射型XSS漏洞攻击的相关文章

看好你的门-XSS攻击(1)-利用反射型XSS漏洞 山寨红客插红旗

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 反射型XSS漏洞 如果一个应用程序使用动态页面向用户显示错误消息,如果系统没有对用户输入的内容进行过滤和处理,就会造成一种常见的XSS漏洞. 提取用户提交的输入并将其插入到服务器响应的HTML代码中,这是XSS漏洞的一个明显特征:如果应用程序没有实施任何过滤或净化措施,那么它很容易受到攻击. 2. 前提和准备 现在很多的浏览器默认有一些防止XSS漏洞或者攻击的功能,推荐用IE浏览器做X

YS&ldquo;本地相册&rdquo;功能存在反射型XSS漏洞【中危】

这是在测试YS"本地相册"功能时发现的一个反射型XSS,自己在安全测试过程中也发现过不少XSS漏洞,唯独这个的发现过程有点区别. 在此之前,我在测试另外一个模块的功能接口的时候发现了一个反射型XSS,当我在测试"本地相册"这个功能的时候,当我用burp拦截到HTTP请求时,发现该请求有3个参数,仔细观察,发现这3个参数居然和之前有XSS漏洞的接口的参数是一模一样的,但是有区别的地方:两者接口名称(action)是不一样的,两者参数个数不一样,之前的是4个,"

从零学习安全测试,从XSS漏洞攻击和防御开始

WeTest 导读 本篇包含了XSS漏洞攻击及防御详细介绍,包括漏洞基础.XSS基础.编码基础.XSS Payload.XSS攻击防御. 第一部分:漏洞攻防基础知识   XSS属于漏洞攻防,我们要研究它就要了解这个领域的一些行话,这样才好沟通交流.同时我建立了一个简易的攻击模型用于XSS漏洞学习. 1. 漏洞术语 了解一些简单术语就好. VUL Vulnerability漏洞,指能对系统造成损坏或能借之攻击系统的Bug. POC Proof of Concept,漏洞证明:可以是可以证明漏洞存在

PHP的$_SERVER[&#39;PHP_SELF&#39;]造成的XSS漏洞攻击及其解决方案

$_SERVER['PHP_SELF']简介 $_SERVER['PHP_SELF'] 表示当前 PHP文件相对于网站根目录的位置地址,与 document root 相关. 假设我们有如下网址,$_SERVER['PHP_SELF']得到的结果分别为: http://www.php-note.com/php/    :   /php/test.php http://www.php-note.com/php/test.php    :    /php/test.php http://www.ph

PHP通用的XSS攻击过滤函数,Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数

XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来... 原文如下: The goal of this function is to be a generic function that can be used to parse almost any input and render it XSS safe. For more information on actual XSS attacks, check out h

XSS漏洞攻击原理与解决办法

转自:http://www.frostsky.com/2011/10/xss-hack/ 对于的用户输入中出现XSS漏洞的问题,主要是由于开发人员对XSS了解不足,安全的意识不够造成的.现在让我们来普及一下XSS的一些常识,以后在开发的时候,每当有用户输入的内容时,都要加倍小心.请记住两条原则:过滤输入和转义输出. 一.什么是XSS XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里

新浪微博的XSS漏洞攻击过程详解

今天晚上(2011年6月28日),新浪微博出现了一次比较大的XSS攻击事件.大量用户自动发送诸如:“郭美美事件的一些未注意到的细节”,“建 党大业中穿帮的地方”,“让女人心动的100句诗歌”,“3D肉团团高清普通话版种子”,“这是传说中的神仙眷侣啊”,“惊爆!范冰冰艳照真流出了”等等 微博和私信,并自动关注一位名为hellosamy的用户. 事件的经过线索如下: 20:14,开始有大量带V的认证用户中招转发蠕虫 20:30,2kt.cn中的病毒页面无法访问 20:32,新浪微博中hellosam

(2)C#之ADO.Net 如何解决SQL注入漏洞攻击

SQL注入就是用户通过客户端请求GET或POST方式将SQL语句提交到服务端,欺骗服务器去执行恶意的SQL语句.例如下面这条SQL语句: 1 "select * from T_stuff where name = '"+txtbox1.text+"'"; 其中txtbox1是一个textbox控件,正常情况下我们会在这个textbox控件中输入一个姓名来查询员工的信息. 但是如果有用户在这个textbox控件中恶意输入一个拼接字符串,例如:"1' or '

XSS脚本攻击漫谈

XSS跨站脚本攻击一直都被认为是客户端  Web安全中最主流的攻击方式.因为  Web环境的复杂性以及 XSS跨站脚本攻击的多变性,使得该类型攻击很难彻底解决.那么,XSS跨站脚本攻击具体攻击行为是什么,又该如何进行有效的防范呢?本文对此进行了有针对性的具体实例分析.跨站脚本攻击(Cross Site Scripting)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的 HTML代码,从而盗取用户资料.利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方