温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java如何防止xss攻击

发布时间:2021-10-15 16:53:39 来源:亿速云 阅读:378 作者:柒染 栏目:编程语言

本篇文章为大家展示了Java如何防止xss攻击,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。

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

背景和现状

当网景(Netscape)最初推出JavaScript语言时,他们也察觉到准许网页服务器发送可执行的代码给一个浏览器的安全风险(即使仅是在一个浏览器的沙盒里)。它所造成的一个关键的问题在于用户同时打开多个浏览器视窗时,在某些例子里,网页里的片断代码被允许从另一个网页或对象取出数据,而因为恶意的网站可以用这个方法来尝试窃取机密信息,所以在某些情形,这应是完全被禁止的。为了解决这个问题,浏览器采用了同源决策——仅允许来自相同域名系统和使用相同协议的对象与网页之间的任何交互。这样一来,恶意的网站便无法借由JavaScript在另一个浏览器窃取机密数据。此后,为了保护用户免受恶意的危害,其他的浏览器与伺服端指令语言采用了类似的访问控制决策。

XSS漏洞可以追溯到1990年代。大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞,如Twitter[1],Facebook[2],MySpace,Orkut[3][4],新浪微博[5]和百度贴吧。研究表明[6],最近几年XSS已经超过缓冲区溢出成为最流行的攻击方式,有68%的网站可能遭受此类攻击。根据开放网页应用安全计划(Open Web Application Security Project)公布的2010年统计数据,在Web安全威胁前10位中,XSS排名第2,仅次于代码注入(Injection)。[7]

检测方法

通常有一些方式可以测试网站是否有正确处理特殊字符:

<script>alert(document.cookie)</script><script>alert(document.cookie)</script><script>alert(document.cookie)</script><script>alert(document.cookie)</script><script>alert (vulnerable)</script>%3Cscript%3Ealert('XSS')%3C/script%3E<script>alert('XSS')</script><img src="javascript:alert('XSS')"><img src="https://cache.yisu.com/upload/information/20201211/272/48442.png" onerror="alert('XSS')"><p ></p>(这个仅于IE7(含)之前有效)

攻击手段和目的

攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如cookie或其他敏感信息),可以自行架设一个网站,让被攻击者通过JavaScript等方式把收集好的数据作为参数提交,随后以数据库等形式记录在攻击者自己的服务器上。

常用的XSS攻击手段和目的有:

盗用cookie,获取敏感信息。利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。漏洞的防御和利用

过滤特殊字符

避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对HTML的过滤:

PHP的htmlentities()或是htmlspecialchars()。Python的cgi.escape()。ASP的Server.HTMLEncode()。ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting LibraryJava的xssprotect (Open Source Library)。(https://code.google.com/archive/p/xssprotect/)Node.js的node-validator。

使用HTTP头指定类型

很多时候可以使用HTTP头指定内容的类型,使得输出的内容避免被作为HTML解析。如在PHP语言中使用以下代码:

<?phpheader('Content-Type: text/javascript; charset=utf-8');?>

即可强行指定输出内容为文本/JavaScript脚本(顺便指定了内容编码),而非可以引发攻击的HTML。

用户方面

包括Internet Explorer、Mozilla Firefox在内的大多数浏览器皆有关闭JavaScript的选项,但关闭功能并非是最好的方法,因为许多网站都需要使用JavaScript语言才能正常运作。通常来说,一个经常有安全更新推出的浏览器,在使用上会比很久都没有更新的浏览器更为安全。

解决提供两个思路

1.使用过滤器过滤输入字符,然后做相应处理。

处理方式:

一种是保留语意,将输入的特殊字符转译存储到数据库,坏处是对数据库或文件系统产生一些不必要的垃圾信息。

一种是过滤掉特殊字符,只保留正常数据,但是有些时候用户需要输入特殊字符,这样不能保证数据原始性。

一种是不让输入,返回异常值。

以上都可以自行进行特殊处理,这里只提供些思路,怎么处理可以根据需求自己选择

过滤器web.xml:

<filter><filter-name>XSSFilter</filter-name><filter-class>com.***.web.filter.XSSFilter</filter-class></filter><filter-mapping><filter-name>XSSFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher> </filter-mapping>

过滤器:

import java.io.IOException; 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; public class XSSFilter implements Filter { FilterConfig filterConfig = null; @Overridepublic void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;} @Overridepublic void destroy() {this.filterConfig = null;} @Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);} }

第一种过滤器: 使用commons-lang3-3.1.jar包的 org.apache.commons.lang3.StringEscapeUtils工具类对特殊字符进行转译。 Example:

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.lang3.StringEscapeUtils; public class XSSRequestWrapper extends HttpServletRequestWrapper { public XSSRequestWrapper(HttpServletRequest servletRequest) {super(servletRequest);} @Overridepublic String getHeader(String name) {return StringEscapeUtils.escapeHtml4(super.getHeader(name));} @Overridepublic String getQueryString() {return StringEscapeUtils.escapeHtml4(super.getQueryString());} @Overridepublic String getParameter(String name) {return StringEscapeUtils.escapeHtml4(super.getParameter(name));} @Overridepublic String[] getParameterValues(String name) {String[] values = super.getParameterValues(name);if (values != null) {int length = values.length;String[] escapseValues = new String[length];for (int i = 0; i < length; i++) {escapseValues[i] = StringEscapeUtils.escapeHtml4(values[i]);}return escapseValues;}return super.getParameterValues(name);}}

第二种过滤器:自己通过正则表达式手写过滤,转译或者消除特殊字符。

Example:

import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper; public class XSSRequestWrapper extends HttpServletRequestWrapper { public XSSRequestWrapper(HttpServletRequest servletRequest) {super(servletRequest);} @Overridepublic String[] getParameterValues(String parameter) {String[] values = super.getParameterValues(parameter); if (values == null) {return null;} int count = values.length;String[] encodedValues = new String[count];for (int i = 0; i < count; i++) {encodedValues[i] = stripXSS(values[i]);} return encodedValues;} @Overridepublic String getParameter(String parameter) {String value = super.getParameter(parameter); return stripXSS(value);} @Overridepublic String getHeader(String name) {String value = super.getHeader(name);return stripXSS(value);} private String stripXSS(String value) {if (value != null) {// Avoid null charactersvalue = value.replaceAll("", ""); // Avoid anything between script tagsPattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll(""); // Avoid anything in a src='...' type of e&shy;xpressionscriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll(""); // Remove any lonesome </script> tagscriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll(""); // Remove any lonesome <script ...> tagscriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll(""); // Avoid eval(...) e&shy;xpressionsscriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll(""); // Avoid e&shy;xpression(...) e&shy;xpressionsscriptPattern = Pattern.compile("e&shy;xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll(""); // Avoid javascript:... e&shy;xpressionsscriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll(""); // Avoid vbscript:... e&shy;xpressionsscriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll(""); // Avoid οnlοad= e&shy;xpressionsscriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");}return value;}}

第三种过滤器: 使用工具类xssProtect,项目中需要引入 xssProtect-0.1.jar、antlr-3.0.1.jar、antlr-runtime-3.0.1.jar 等3个 jar 包。具体实现没有试验,可以参考下这个:http://liuzidong.iteye.com/blog/1744023

用maven管理jar包的话,pom.xml如下:

<!-- https://mvnrepository.com/artifact/org.antlr/antlr --><dependency> <groupId>org.antlr</groupId> <artifactId>antlr</artifactId> <version>3.0.1</version></dependency> <!-- https://mvnrepository.com/artifact/org.antlr/antlr-runtime --><dependency> <groupId>org.antlr</groupId> <artifactId>antlr-runtime</artifactId> <version>3.0.1</version></dependency>

2.第二种思路就是输入不管他,只在显示的时候,进行转译,可以用过滤器或者自行解决。

如果页面的展示大部分都在bootstrap表单里,那么bootstrap的自带属性就可以解决:

escape: true,// 是否转义 默认 为false

个别可以自己在写方法转译,例如:

var escapeHTML = function (text) {  if (typeof text === 'string') {   return text    .replace(/&/g, '&')    .replace(/</g, '<')    .replace(/>/g, '>')    .replace(/"/g, '"')    .replace(/'/g, ''')    .replace(/`/g, '&#x60;');  }  return text; };

上述内容就是Java如何防止xss攻击,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI