iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解java解决XSS攻击常用方法总结
  • 266
分享到

详解java解决XSS攻击常用方法总结

2024-04-02 19:04:59 266人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

前言 在项目验收阶段,通常会对待验收项目做一些安全漏洞的测试,比如接口攻击,并发测试,XSS注入,sql恶意注入测试,安全越权等操作,这时,就是考验项目的安全方面是否做的足够健壮的时

前言

项目验收阶段,通常会对待验收项目做一些安全漏洞的测试,比如接口攻击,并发测试,XSS注入,sql恶意注入测试,安全越权等操作,这时,就是考验项目的安全方面是否做的足够健壮的时候,本篇对XSS脚本攻击在实际WEB项目中的处理办法,提供2种可实行的方法

xss攻击

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是javascript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的html。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容

简单说就是说,通过在输入框输入一些js代码,如在账号密码输入框中输入


<video src=1 onerror=alert(/xss/)/>

或者


<script>alert("@@") </script>

这样点击提交的时候就会触发alert弹窗,分别弹出 xss 和 @@ 的内容,这里只是做个简单的演示,弹了个窗口,还能存储病毒下载地址到服务端,进入的时候自动下载,或者修改你的cookie啥的,这里感兴趣可以百度查查xss攻击

解决方式一:强制修改html敏感标签内容

这是一种相对容易理解的方式,解决思路就是,当恶意注入的字段中,包含了类似<script>alert(ooo)</script>这种html标签时,后台程序代码中强制替换或更改标签内容,这样存入数据库的内容再次返回至页面时,就不会以html的形式进行执行了

下面提供一个工具类



public class XssStrUtils {

    
    public static String replaceHtmlCode(String content) {
        if (null == content) return null;
        if (0 == content.length()) return "";
        // 需要滤除的脚本事件关键字
        String[] evenTKEyWords = {
                "onmouseover", "onmouseout", "onmousedown", "onmouseup", "onmousemove", "onclick", "ondblclick",
                "onkeypress", "onkeydown", "onkeyup", "ondragstart", "onerrorupdate", "onhelp", "onreadystatechange",
                "onrowenter", "onrowexit", "onselectstart", "onload", "onunload", "onbeforeunload", "onblur",
                "onerror", "onfocus", "onresize", "onscroll", "oncontextmenu", "alert"
        };
        content = replace(content, "<script", "<script", false);
        content = replace(content, "</script", "</script", false);
        content = replace(content, "<marquee", "<marquee", false);
        content = replace(content, "</marquee", "</marquee", false);
        content = replace(content, "'", "_", false);// 将单引号替换成下划线
        content = replace(content, "\"", "_", false);// 将双引号替换成下划线
        // 滤除脚本事件代码
        for (int i = 0; i < eventKeywords.length; i++) {
            content = replace(content, eventKeywords[i], "_" + eventKeywords[i], false); // 添加一个"_", 使事件代码无效
        }
        return content;
    }

    
    private static String replace(String source, String oldStr, String newStr) {
        return replace(source, oldStr, newStr, true);
    }

    
    private static String replace(String source, String oldStr, String newStr,boolean matchCase) {
        if (source == null) return null;
        // 首先检查旧字符串是否存在, 不存在就不进行替换
        if (source.toLowerCase().indexOf(oldStr.toLowerCase()) == -1) return source;
        int findStartPos = 0;
        int a = 0;
        while (a > -1) {
            int b = 0;
            String str1, str2, str3, str4, strA, strB;
            str1 = source;
            str2 = str1.toLowerCase();
            str3 = oldStr;
            str4 = str3.toLowerCase();
            if (matchCase) {
                strA = str1;
                strB = str3;
            } else {
                strA = str2;
                strB = str4;
            }
            a = strA.indexOf(strB, findStartPos);
            if (a > -1) {
                b = oldStr.length();
                findStartPos = a + b;
                StringBuffer bbuf = new StringBuffer(source);
                source = bbuf.replace(a, a + b, newStr) + "";
                // 新的查找开始点位于替换后的字符串的结尾
                findStartPos = findStartPos + newStr.length() - b;
            }
        }
        return source;
    }

}

我们用一个实际的接口做一下简单的测试


	@PostMapping("/getAccName")
    public String getAccName(@RequestBody NameParams params){
        String s = XssStrUtils.replaceHtmlCode(params.getName());
        return s;
    }

使用接口工具调一下,

在这里插入图片描述

使用这种方式,即使前端恶意注入了某些非法的html标签,经过后端的过滤处理,返回的内容就不会执行html的相关操作事件了

解决方式二:利用过滤器过滤非法html标签

第二种思路,考虑在过滤器中添加对所有请求接口的参数进行参数的拦截过滤,即程序认为的不合法标签都会自动做过滤,至于过滤的规则,可以借助现有的第三方组件,比如spring框架的htmlUtil类,这里使用hutool工具集提供的相关api做处理

导入依赖


		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.9</version>
        </dependency>

1、添加自定义过滤器增强包装类


public class XssHttpRequestWrapper extends httpservletRequestWrapper {

    public XsshttpRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        if(!StringUtils.isEmpty(value)){
            value = HtmlUtil.filter(value);
        }
        return value;
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if(values!=null){
            for(int i=0;i<values.length;i++){
                String value = values[i];
                if(!StringUtils.isEmpty(value)){
                    value = HtmlUtil.filter(value);
                }
                values[i]=value;
            }
        }
        return values;
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> parameters = super.getParameterMap();
        Map<String, String[]> map = new LinkedHashMap<>();
        if(parameters !=null){
            for(String key : parameters.keySet()){
                String[] values = parameters.get(key);
                for(int i=0;i<values.length;i++){
                    String value = values[i];
                    if(!StringUtils.isEmpty(value)){
                        value = HtmlUtil.filter(value);
                    }
                    values[i]=value;
                }
                map.put(key,values);
            }
        }
        return map;
    }

    @Override
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if(!StringUtils.isEmpty(value)){
            value = HtmlUtil.filter(value);
        }
        return value;
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        InputStream in = super.getInputStream();
        InputStreamReader reader = new InputStreamReader(in, Charset.forName("UTF-8"));
        BufferedReader buffer = new BufferedReader(reader);
        StringBuffer body = new StringBuffer();
        String line = buffer.readLine();
        while (line !=null){
            body.append(line);
            line = buffer.readLine();
        }
        buffer.close();
        reader.close();
        in.close();
        Map<String,Object> map = JSONUtil.parseObj(body.toString());
        Map<String,Object> result = new LinkedHashMap<>();
        for(String key : map.keySet()){
            Object val = map.get(key);
            if(val instanceof String){
                if(!StringUtils.isEmpty(val.toString())){
                    result.put(key,HtmlUtil.filter(val.toString()));
                }
            }else {
                result.put(key,val);
            }
        }

        String json = JSONUtil.toJsonStr(result);
        ByteArrayInputStream bain = new ByteArrayInputStream(json.getBytes());
        return new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return false;
            }
            @Override
            public boolean isReady() {
                return false;
            }
            @Override
            public void setReadListener(ReadListener readListener) {

            }
            @Override
            public int read() throws IOException {
                return bain.read();
            }
        };
    }
}

可以理解为,在自定义过滤器中添加上面的增强类,那么所有请求后端的接口都将先走改类的逻辑,参数进行过滤

2、自定义过滤器并注入全局bean


public class XssFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        XssHttpRequestWrapper requestWrapper = new XssHttpRequestWrapper(request);
        filterChain.doFilter(requestWrapper,servletResponse);
    }

    @Override
    public void destroy() {

    }
}


@Configuration
public class XSSFilterReGISter {

    @Bean
    public FilterRegistrationBean<XssFilter> RegistTest1(){
        //通过FilterRegistrationBean实例设置优先级可以生效
        FilterRegistrationBean<XssFilter> bean = new FilterRegistrationBean<XssFilter>();
        bean.setFilter(new XssFilter());//注册自定义过滤器
        bean.setName("flilter");//过滤器名称
        bean.addUrlPatterns("/*");//过滤所有路径
        return bean;
    }

}

仍然使用上面的接口做一下测试


	@PostMapping("/getAccName")
    public String getAccName(@RequestBody NameParams params){
        return "name is : "+ params.getName();
    }

在这里插入图片描述

通过这种方式,直接将注入的敏感标签符号去掉,这样确保了入库的数据的安全性,返回给页面的数据就不存在非法html标签问题了

到此这篇关于详解java解决XSS攻击常用方法总结的文章就介绍到这了,更多相关java XSS攻击 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解java解决XSS攻击常用方法总结

本文链接: https://www.lsjlt.com/news/123962.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解java解决XSS攻击常用方法总结
    前言 在项目验收阶段,通常会对待验收项目做一些安全漏洞的测试,比如接口攻击,并发测试,XSS注入,SQL恶意注入测试,安全越权等操作,这时,就是考验项目的安全方面是否做的足够健壮的时...
    99+
    2024-04-02
  • 使用java如何解决XSS攻击
    使用java如何解决XSS攻击?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对...
    99+
    2023-06-14
  • ARP攻击的解决方法常用解决办法
    一般要提前做好防制工作,同时需要在客户端和路由器上做双向的绑定工作,这样的话无论ARP病毒是伪造本机的IP/MAC或者网关的地址都不会出现上网掉线或者大面积断线MAC绑定。但是此动作,如果重启了电脑,作用就会消失,所以可...
    99+
    2023-05-23
    解决 解决办法 ARP 方法
  • Java中String类常用方法总结详解
    目录一. String对象的比较1. ==比较是否引用同一个对象2. boolean equals(Object anObject)3. int compareTo(String s...
    99+
    2024-04-02
  • java过滤特殊字符操作(xss攻击解决方案)
    XSS ,全名:cross-site scripting(跨站点脚本),是当前 web 应用中最危险和最普遍的漏洞之一。攻击者尝试注入恶意脚本代码(常js脚本)到受信任的网站上执行恶...
    99+
    2024-04-02
  • Swift 数组及常用方法详解总结
    目录1. 创建数组2. 快捷创建重复元素的数组3. 数组相加4. 常用方法5. 数组遍历Swift 数组及常用方法 1. 创建数组 // 创建整型数组 var array1: [...
    99+
    2024-04-02
  • Swift Set集合及常用方法详解总结
    Swift 集合 Set 及常用方法 1. 创建Set集合 // 创建Set var set: Set<Int> = [1, 2, 3] var set2 = Set...
    99+
    2024-04-02
  • php的ddos攻击解决方法
    PHP是一种编程语言,而DDoS攻击是一种网络攻击,因此解决DDoS攻击不是通过PHP语言来实现的。以下是一些常见的解决DDoS攻击的方法:1. 增加带宽:通过增加服务器的带宽来抵御大规模的DDoS攻击,使其有足够的处理能力来应对攻击流...
    99+
    2023-08-11
    php
  • 详解React 如何防止 XSS 攻击论$$typeof 的作用
    目录JSXXSS 攻击防止 XSS 攻击的方法React 对于文本节点的处理dangerouslySetInnerHTML 处理富文本节点$$typeof 的作用JSX 先来简单复习...
    99+
    2024-04-02
  • Swift 字符串类型及常用方法详解总结
    目录1. 构造2. 拼接3. 字符4. 转义符5. 常用方法Swift 字符串类型及常用方法 1. 构造 // 直接赋值 text = "" // 1. 构造方法 text =...
    99+
    2024-04-02
  • 归纳总结Remix 表单常用方法及示例详解
    目录Remix 的三种表单回顾表单基础表单提交的形式阻止跳转Remix 提供的表单组件一个简单的 demo使用钩子函数提交函数Remix fetcher 表单一个简单的 demo没有...
    99+
    2023-03-24
    remix 表单用法归纳 Remix 表单常用方法
  • SQLServer之常用函数总结详解
    SQLServer中的常用函数 字符串函数 len() 计算字符串的长度 select LEN(name) from test1 --计算name的长度 大小写转换...
    99+
    2024-04-02
  • php针对ddos攻击的解决方法
    针对DDoS攻击,以下是一些PHP的解决方法:1. 使用防火墙:配置服务器的防火墙以过滤和阻止具有可疑流量模式的请求。可以使用软件防...
    99+
    2023-08-28
    PHP
  • Java中String类的常用方法总结
    目录概述特点使用步骤常用方法判断功能的方法获取功能的方法转换功能的方法分割功能的方法概述 java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如&quo...
    99+
    2022-11-13
    Java String类常用方法 Java String类 方法 Java String类
  • 不花冤枉钱!CMS 防御 XSS 攻击的低成本解决方案
    CMS 系统面临 XSS 攻击风险 CMS(内容管理系统)是一种用于创建和管理网站内容的应用程序。它通常包含一个易于使用的图形用户界面(GUI),允许用户在无需编写代码的情况下创建和编辑网页。CMS 系统广泛应用于各种网站,包括新闻网站...
    99+
    2024-02-13
    CMS XSS 攻击 防御 解决方案 低成本
  • JavaScript数组常用方法实例讲解总结
    目录数组常用方法concat() 方法join() 方法pop() 方法push() 方法reverse() 方法shift() 方法slice() 方法sort...
    99+
    2024-04-02
  • PHP中常用的加密解密方法总结
    PHP中常用的加密解密方法有以下几种:1. MD5加密:使用md5()函数可以对字符串进行MD5加密,生成一个32位的哈希值。2. ...
    99+
    2023-08-29
    PHP
  • 总结常见的PHP加密解决方案
    随着互联网的不断发展和深入,网站变得越来越普及。同时,由于信息安全的重要性日益增加,越来越多的网站采用了加密技术来确保数据的安全性。PHP作为一种广泛使用的服务器端脚本语言,也不例外。本文将介绍一些PHP加密解决方案,以帮助您保护网站的信息...
    99+
    2023-05-14
  • Java算法比赛常用方法实例总结
    1. 开方:Math.sqrt(x); 2. x的a方:Math.pow(x,a); 3. 绝对值:Math.abs(x); 4. BigInteger:大数(加,减,乘,除,取余)...
    99+
    2023-05-19
    java的算法 java基本算法 java经典算法
  • K3问题总结和解决方法
    一、问题描述 客户端运行,提示:该数据正在被修改,无法编辑? 解决方法1、关闭杀毒软件; 2、用KDMAINDBG.EXE跟踪检测组件; 3、在数据库的该套帐实体中的表中清空t-funcontrol的内容 二、问题描述1...
    99+
    2023-01-31
    解决方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作