返回顶部
首页 > 资讯 > 精选 >使用java如何解决XSS攻击
  • 258
分享到

使用java如何解决XSS攻击

2023-06-14 14:06:03 258人浏览 泡泡鱼
摘要

使用java如何解决XSS攻击?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对

使用java如何解决XSS攻击?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Java的特点有哪些

Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。2.Java具有简单性、面向对象、分布式安全性、平台独立与可移植性、动态性等特点。3.使用Java可以编写桌面应用程序、WEB应用程序、分布式系统和嵌入式系统应用程序等。

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;    }

使用接口工具调一下,

使用java如何解决XSS攻击

使用这种方式,即使前端恶意注入了某些非法的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() {    }}
@Configurationpublic 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();    }

使用java如何解决XSS攻击

看完上述内容,你们掌握使用java如何解决XSS攻击的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 使用java如何解决XSS攻击

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

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

猜你喜欢
  • 使用java如何解决XSS攻击
    使用java如何解决XSS攻击?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对...
    99+
    2023-06-14
  • jsp如何解决XSS攻击
    jsp解决XSS攻击的方案:采用struts2的拦截器过滤,将提交上来的参数转码来解决,例如配置struts.xml,代码如下:<package name="default" namespace...
    99+
    2024-04-02
  • java如何防止xss攻击
    java防止xss攻击的方案:配置过滤器,代码如下:public class XSSFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig)...
    99+
    2024-04-02
  • struts怎么解决xss攻击
    struts解决xss攻击的方法:采用struts2的拦截器过滤,将提交上来的参数转码来解决,例如配置struts.xml,代码如下:<package name="default" namesp...
    99+
    2024-04-02
  • 详解java解决XSS攻击常用方法总结
    前言 在项目验收阶段,通常会对待验收项目做一些安全漏洞的测试,比如接口攻击,并发测试,XSS注入,SQL恶意注入测试,安全越权等操作,这时,就是考验项目的安全方面是否做的足够健壮的时...
    99+
    2024-04-02
  • tp5如何防xss攻击
    tp5防xss攻击的方法:在公共函数文件common.php中加入以下方法:function filter_default($value){return htmlspecialchars($value, ENT_NOQUOTES);}在配置...
    99+
    2024-04-02
  • xss攻击如何修复
    xss攻击的修复方案:对输入的数据进行HTML转义,使其不会识别为可执行脚本,例如:String result = HtmlUtils.htmlEscape(source);根据白名单的标签和属性对数据进行过滤...
    99+
    2024-04-02
  • 如何过滤xss攻击
    过滤xss攻击的方法:XSS过滤器示例代码:package com.devframe.filter;import javax.servlet.*;import javax.servlet.http.HttpSe...
    99+
    2024-04-02
  • php如何过滤xss攻击
    php过滤xss攻击的示例:在对应的php文件中添加以下代码:<php  function RemoveXSS($val) {     //&n...
    99+
    2024-04-02
  • jsp如何修复xss攻击
    jsp修复xss攻击的方法:jsp页面接收参数时,对参数进行过滤处理,例如:请求链接:http://a.b.com/login.jspsuccessUrl=<script>alert(111)</script>参数过...
    99+
    2024-04-02
  • jwt如何防范xss攻击
    jwt防范xss攻击的方法:使用jwt验证,由于服务端不保存用户信息,因此不用做sessonid复制,同时用户发请求给服务端时,前端使用JS将jwt放在header中手动发送给服务端,服务端验证header中的JWT字段,而非cookie信...
    99+
    2024-04-02
  • js如何防止xss攻击
    js防止xss攻击的方法:对用户的输入及请求都进行过滤检查,如对特殊字符进行过滤,设置输入域的匹配规则等,例如:function removeXss(val){val = val.replace(/([\x00-\x08][\x0b-\x0...
    99+
    2024-04-02
  • asp如何过滤xss攻击
    asp过滤xss攻击的方法:在web.config增加httpModules节点,例如:<httpModules><add name="HttpAccessInterceptModule"&n...
    99+
    2024-04-02
  • yii2如何防止xss攻击
    yii2防止xss攻击的示例代码:在对应文件中添加以下代码进行调用:function actionClean($str){$str=trim($str);$str=strip_tags($str);$str=stripslashe...
    99+
    2024-04-02
  • django如何防止xss攻击
    django防止xss攻击的方法:使用escape过滤器,无需转义时使用safe过滤器,对单一变量进行转义过滤,例如:Hello {{ a|escape }} # 转义{{a}} # 转义{{a|safe}} # 认为a安全,不进行转义利用...
    99+
    2024-04-02
  • react如何防止xss攻击
    react防止xss攻击的方法:react在渲染html内容和渲染dom属性时都会将 "'&<>这几个字符进行转义,转义部分源码如下:for (index = match....
    99+
    2024-04-02
  • angular如何防止xss攻击
    angular防止xss攻击的示例:angular提供了一个DomSanitizer服务,提供的方法如下:export enum SecurityContext { NONE, HTML, STYLE, SCRIPT, URL, RESOU...
    99+
    2024-04-02
  • emlog如何防止xss攻击
    emlog防止xss攻击的方法:给cookie设置上httponly检查,操作步骤:打开“include\lib\loginauth.php”文件,找到第134行的setAuthCookie函数,改成以下代码:public static f...
    99+
    2024-04-02
  • vue如何防止xss攻击
    这篇“vue如何防止xss攻击”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何防止xss攻击”文章吧。vue防止xs...
    99+
    2023-07-04
  • 如何理解sql注入和xss攻击
    SQL注入攻击是指通过构建特殊的输入作为参数传入Web应用程序,一般是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作;而Xss攻击称为跨站脚本攻击,它是一种经常出现在web应用中的计算机安全漏洞,因Web应用程序对用户的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作