最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java防止xss攻擊附相關(guān)文件下載

 更新時間:2020年02月01日 15:26:44   投稿:mdxy-dxy  
首先說一下思路,防止這種類似于注入攻擊,就是使用攔截器(Filter)處理特殊字符或過濾特殊字符 今天介紹一個方法,利用覆蓋Servlet的getParameter方法達到處理特殊字符的目的來解決(防止)Xss攻擊 web.xml,需要的朋友可以參考下

跨站腳本(英語:Cross-site scripting,通常簡稱為:XSS)是一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網(wǎng)頁上,其他用戶在觀看網(wǎng)頁時就會受到影響。這類攻擊通常包含了HTML以及用戶端腳本語言。

XSS攻擊通常指的是通過利用網(wǎng)頁開發(fā)時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網(wǎng)頁,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序。這些惡意網(wǎng)頁程序通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,F(xiàn)lash或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到更高的權(quán)限(如執(zhí)行一些操作)、私密網(wǎng)頁內(nèi)容、會話和cookie等各種內(nèi)容。

背景和現(xiàn)狀

當網(wǎng)景(Netscape)最初推出JavaScript語言時,他們也察覺到準許網(wǎng)頁服務(wù)器發(fā)送可執(zhí)行的代碼給一個瀏覽器的安全風險(即使僅是在一個瀏覽器的沙盒里)。它所造成的一個關(guān)鍵的問題在于用戶同時打開多個瀏覽器視窗時,在某些例子里,網(wǎng)頁里的片斷代碼被允許從另一個網(wǎng)頁或?qū)ο笕〕鰯?shù)據(jù),而因為惡意的網(wǎng)站可以用這個方法來嘗試竊取機密信息,所以在某些情形,這應(yīng)是完全被禁止的。為了解決這個問題,瀏覽器采用了同源決策——僅允許來自相同域名系統(tǒng)和使用相同協(xié)議的對象與網(wǎng)頁之間的任何交互。這樣一來,惡意的網(wǎng)站便無法借由JavaScript在另一個瀏覽器竊取機密數(shù)據(jù)。此后,為了保護用戶免受惡意的危害,其他的瀏覽器與伺服端指令語言采用了類似的訪問控制決策。

XSS漏洞可以追溯到1990年代。大量的網(wǎng)站曾遭受XSS漏洞攻擊或被發(fā)現(xiàn)此類漏洞,如Twitter[1],F(xiàn)acebook[2],MySpace,Orkut[3][4] ,新浪微博[5]和百度貼吧 。研究表明[6],最近幾年XSS已經(jīng)超過緩沖區(qū)溢出成為最流行的攻擊方式,有68%的網(wǎng)站可能遭受此類攻擊。根據(jù)開放網(wǎng)頁應(yīng)用安全計劃(Open Web Application Security Project)公布的2010年統(tǒng)計數(shù)據(jù),在Web安全威脅前10位中,XSS排名第2,僅次于代碼注入(Injection)。[7]

檢測方法

通常有一些方式可以測試網(wǎng)站是否有正確處理特殊字符:

<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="http://xxx.com/yyy.png" onerror="alert('XSS')">
<div style="height:expression(alert('XSS'),1)"></div>(這個僅于IE7(含)之前有效)

攻擊手段和目的

攻擊者使被攻擊者在瀏覽器中執(zhí)行腳本后,如果需要收集來自被攻擊者的數(shù)據(jù)(如cookie或其他敏感信息),可以自行架設(shè)一個網(wǎng)站,讓被攻擊者通過JavaScript等方式把收集好的數(shù)據(jù)作為參數(shù)提交,隨后以數(shù)據(jù)庫等形式記錄在攻擊者自己的服務(wù)器上。

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

盜用cookie,獲取敏感信息。
利用植入Flash,通過crossdomain權(quán)限設(shè)置進一步獲取更高權(quán)限;或者利用Java等得到類似的操作。
利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執(zhí)行一些管理動作,或執(zhí)行一些一般的如發(fā)微博、加好友、發(fā)私信等操作。
利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當?shù)耐镀被顒印?br /> 在訪問量極大的一些頁面上的XSS可以攻擊一些小型網(wǎng)站,實現(xiàn)DDoS攻擊的效果。
漏洞的防御和利用

過濾特殊字符

避免XSS的方法之一主要是將用戶所提供的內(nèi)容進行過濾,許多語言都有提供對HTML的過濾:

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

使用HTTP頭指定類型

很多時候可以使用HTTP頭指定內(nèi)容的類型,使得輸出的內(nèi)容避免被作為HTML解析。如在PHP語言中使用以下代碼:

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

即可強行指定輸出內(nèi)容為文本/JavaScript腳本(順便指定了內(nèi)容編碼),而非可以引發(fā)攻擊的HTML。

用戶方面

包括Internet Explorer、Mozilla Firefox在內(nèi)的大多數(shù)瀏覽器皆有關(guān)閉JavaScript的選項,但關(guān)閉功能并非是最好的方法,因為許多網(wǎng)站都需要使用JavaScript語言才能正常運作。通常來說,一個經(jīng)常有安全更新推出的瀏覽器,在使用上會比很久都沒有更新的瀏覽器更為安全。

解決提供兩個思路

1.使用過濾器過濾輸入字符,然后做相應(yīng)處理。

處理方式:

一種是保留語意,將輸入的特殊字符轉(zhuǎn)譯存儲到數(shù)據(jù)庫,壞處是對數(shù)據(jù)庫或文件系統(tǒng)產(chǎn)生一些不必要的垃圾信息。

一種是過濾掉特殊字符,只保留正常數(shù)據(jù),但是有些時候用戶需要輸入特殊字符,這樣不能保證數(shù)據(jù)原始性。

一種是不讓輸入,返回異常值。

以上都可以自行進行特殊處理,這里只提供些思路,怎么處理可以根據(jù)需求自己選擇

過濾器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;
 
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}
 
	@Override
	public void destroy() {
		this.filterConfig = null;
	}
 
	@Override
	public 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工具類對特殊字符進行轉(zhuǎn)譯。 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);
	}
 
	@Override
	public String getHeader(String name) {
		return StringEscapeUtils.escapeHtml4(super.getHeader(name));
	}
 
	@Override
	public String getQueryString() {
		return StringEscapeUtils.escapeHtml4(super.getQueryString());
	}
 
	@Override
	public String getParameter(String name) {
		return StringEscapeUtils.escapeHtml4(super.getParameter(name));
	}
 
	@Override
	public 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);
	}
}

第二種過濾器:自己通過正則表達式手寫過濾,轉(zhuǎn)譯或者消除特殊字符。

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);
	}
 
	@Override
	public 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;
	}
 
	@Override
	public String getParameter(String parameter) {
		String value = super.getParameter(parameter);
 
		return stripXSS(value);
	}
 
	@Override
	public String getHeader(String name) {
		String value = super.getHeader(name);
		return stripXSS(value);
	}
 
	private String stripXSS(String value) {
		if (value != null) {
			// Avoid null characters
			value = value.replaceAll("", "");
 
			// Avoid anything between script tags
			Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");
 
			// Avoid anything in a src='...' type of e­xpression
			scriptPattern = 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> tag
			scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");
 
			// Remove any lonesome <script ...> tag
			scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
 
			// Avoid eval(...) e­xpressions
			scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
 
			// Avoid e­xpression(...) e­xpressions
			scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
			value = scriptPattern.matcher(value).replaceAll("");
 
			// Avoid javascript:... e­xpressions
			scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");
 
			// Avoid vbscript:... e­xpressions
			scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
			value = scriptPattern.matcher(value).replaceAll("");
 
			// Avoid οnlοad= e­xpressions
			scriptPattern = 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 包。具體實現(xiàn)沒有試驗,可以參考下這個: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.第二種思路就是輸入不管他,只在顯示的時候,進行轉(zhuǎn)譯,可以用過濾器或者自行解決。

如果頁面的展示大部分都在bootstrap表單里,那么bootstrap的自帶屬性就可以解決:

escape: true,// 是否轉(zhuǎn)義 默認 為false

個別可以自己在寫方法轉(zhuǎn)譯,例如:

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

附件:

xssProtect-0.1.jar、antlr-3.0.1.jar、antlr-runtime-3.0.1.jar打包下載 

相關(guān)文章

  • Java?synchronized輕量級鎖實現(xiàn)過程淺析

    Java?synchronized輕量級鎖實現(xiàn)過程淺析

    這篇文章主要介紹了Java synchronized輕量級鎖實現(xiàn)過程,synchronized是Java里的一個關(guān)鍵字,起到的一個效果是"監(jiān)視器鎖",它的功能就是保證操作的原子性,同時禁止指令重排序和保證內(nèi)存的可見性
    2023-02-02
  • RateLimiter 源碼分析

    RateLimiter 源碼分析

    本文主要對ratelimiter的常用方法以及源碼進行了分析解讀,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • MyBatis Oracle 自增序列的實現(xiàn)方法

    MyBatis Oracle 自增序列的實現(xiàn)方法

    這篇文章給大家分享MyBatis Oracle 自增序列的實現(xiàn)方法及mybatis配置oracle的主鍵自增長的方法,非常不錯具有一定的參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11
  • Mybatis日志配置方式(slf4j、log4j、log4j2)

    Mybatis日志配置方式(slf4j、log4j、log4j2)

    這篇文章主要介紹了Mybatis日志配置方式(slf4j、log4j、log4j2),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 利用?SpringBoot?在?ES?中實現(xiàn)類似連表查詢功能

    利用?SpringBoot?在?ES?中實現(xiàn)類似連表查詢功能

    這篇文章主要介紹了如何利用?SpringBoot?在?ES?中實現(xiàn)類似連表的查詢功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • SpringBoot加載bean的八種方式總結(jié)

    SpringBoot加載bean的八種方式總結(jié)

    springboot難免要用到bean,但這些bean如何導(dǎo)入,對于初學者時間頭疼的事,下面這篇文章主要給大家介紹了關(guān)于SpringBoot加載bean的八種方式,需要的朋友可以參考下
    2022-10-10
  • java巧用@Convert實現(xiàn)表字段自動轉(zhuǎn)entity

    java巧用@Convert實現(xiàn)表字段自動轉(zhuǎn)entity

    本文主要介紹了java巧用@Convert實現(xiàn)表字段自動轉(zhuǎn)entity,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • SpringMvc請求處理參數(shù)?和?響應(yīng)數(shù)據(jù)處理的示例詳解

    SpringMvc請求處理參數(shù)?和?響應(yīng)數(shù)據(jù)處理的示例詳解

    這篇文章主要介紹了SpringMvc請求處理參數(shù)和響應(yīng)數(shù)據(jù)處理,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 教你快速搭建sona服務(wù)及idea使用sona的方法

    教你快速搭建sona服務(wù)及idea使用sona的方法

    Sonar 是一個用于代碼質(zhì)量管理的開放平臺。通過插件機制,Sonar 可以集成不同的測試工具,代碼分析工具,以及持續(xù)集成工具,本文給大家分享搭建sona服務(wù)及idea使用sona的方法,感興趣的朋友一起看看吧
    2021-06-06
  • Spring boot應(yīng)用啟動后首次訪問很慢的解決方案

    Spring boot應(yīng)用啟動后首次訪問很慢的解決方案

    這篇文章主要介紹了Spring boot應(yīng)用啟動后首次訪問很慢的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

玉门市| 弥渡县| 徐水县| 万全县| 永寿县| 齐河县| 镶黄旗| 甘洛县| 闽清县| 普安县| 浮山县| 安乡县| 洛浦县| 宁安市| 资源县| 察哈| 永新县| 文山县| 永清县| 石首市| 蒲江县| 潞西市| 泸溪县| 佛山市| 宁津县| 阳泉市| 大宁县| 沁阳市| 九江县| 溧阳市| 土默特右旗| 江阴市| 闵行区| 汾西县| 剑阁县| 奈曼旗| 裕民县| 蓬安县| 密云县| 山阳县| 屏山县|