欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java過(guò)濾特殊字符操作(xss攻擊解決方案)

 更新時(shí)間:2021年06月29日 10:40:52   作者:呆狗PapayaDog  
這篇文章主要介紹了java過(guò)濾特殊字符操作(xss攻擊解決方案),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

XSS ,全名:cross-site scripting(跨站點(diǎn)腳本),是當(dāng)前 web 應(yīng)用中最危險(xiǎn)和最普遍的漏洞之一。攻擊者嘗試注入惡意腳本代碼(常js腳本)到受信任的網(wǎng)站上執(zhí)行惡意操作,用戶使用瀏覽器瀏覽含有惡意腳本頁(yè)面時(shí),會(huì)執(zhí)行該段惡意腳本,進(jìn)而影響用戶(比如關(guān)不完的網(wǎng)站、盜取用戶的 cookie 信息從而偽裝成用戶去操作)等等。

它與 SQL 注入很類(lèi)似,同樣是通過(guò)注入惡意指令來(lái)進(jìn)行攻擊。但 SQL 注入是在服務(wù)器端上執(zhí)行的,而 XSS 攻擊是在客戶端上執(zhí)行的,這點(diǎn)是他們本質(zhì)區(qū)別。

其實(shí),個(gè)人感覺(jué)對(duì)于xss攻擊不必區(qū)分究竟是反射型XSS、存儲(chǔ)型XSS還是DOM Based XSS,只需要知道如何去防護(hù)。而防護(hù)的最有效的措施就是過(guò)濾,對(duì)前端頁(yè)面提交到后臺(tái)的內(nèi)容進(jìn)行過(guò)濾。具體如下:

1.解決方法一

攔截所有的請(qǐng)求參數(shù),對(duì)請(qǐng)求參數(shù)中包含特殊字符'<‘或'>'進(jìn)行過(guò)濾。

package com.haier.openplatform.srm.base.filter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
public class StringFilter extends OncePerRequestFilter{
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
chain.doFilter(new StringFilterRequest((HttpServletRequest)request), response);
}
}
class StringFilterRequest extends HttpServletRequestWrapper {
public StringFilterRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
// 返回值之前 先進(jìn)行過(guò)濾
return filterDangerString(super.getParameter(name));
}
@Override
public String[] getParameterValues(String name) {
// 返回值之前 先進(jìn)行過(guò)濾
String[] values = super.getParameterValues(name);
if(values==null){
return null;
}
for (int i = 0; i < values.length; i++) {
values[i] = filterDangerString(values[i]);
}
return values;
}
@Override
public Map getParameterMap() {
Map keys = super.getParameterMap();
Set set = keys.entrySet();
Iterator iters = set.iterator();
while (iters.hasNext()) {
Object key = iters.next();
Object value = keys.get(key);
keys.put(key, filterDangerString((String[]) value));
}
return keys;
}
/*@Override
public Object getAttribute(String name) {
// TODO Auto-generated method stub
Object object = super.getAttribute(name);
if (object instanceof String) {
return filterDangerString((String) super.getAttribute(name));
} else
return object;
}*/
public String filterDangerString(String value) {
if (value == null) {
return null;
}
//        value = value.replaceAll("\\{", "{");
value = value.replaceAll("<", "&lt;");
value = value.replaceAll(">", "&gt;");
//        value = value.replaceAll("\t", "    ");
//        value = value.replaceAll("\r\n", "\n");
//        value = value.replaceAll("\n", "<br/>");
//        value = value.replaceAll("'", "&#39;");
//        value = value.replaceAll("\\\\", "&#92;");
//        value = value.replaceAll("\"", "&quot;");
//        value = value.replaceAll("\\}", "﹜").trim();
return value;
}
public String[] filterDangerString(String[] value) {
if (value == null) {
return null;
}
for (int i = 0; i < value.length; i++) {
String val = filterDangerString(value[i]);
value[i] = val;
}
return value;
}
}

web.xm中的過(guò)濾器配置:

 <filter>
  <filter-name>StringFilter</filter-name>
  <filter-class>com.xxx.base.filter.StringFilter</filter-class>
 </filter>
 
 <filter-mapping>
  <filter-name>StringFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

2.解決方法二(轉(zhuǎn),未驗(yàn)證)

2.1前端過(guò)濾

2.1.1 javascript 原生方法

//轉(zhuǎn)義  元素的innerHTML內(nèi)容即為轉(zhuǎn)義后的字符  
function htmlEncode ( str ) {  
  var ele = document.createElement('span');  
  ele.appendChild( document.createTextNode( str ) );  
  return ele.innerHTML;  
}  
//解析   
function htmlDecode ( str ) {  
  var ele = document.createElement('span');  
  ele.innerHTML = str;  
  return ele.textContent;  
} 

2.1.2 JQuery 方法

function htmlEncodeJQ ( str ) {  
    return $('<span/>').text( str ).html();  
}  
function htmlDecodeJQ ( str ) {  
    return $('<span/>').html( str ).text();  
} 

2.1.3 調(diào)用方法

var msg1= htmlEncodeJQ('<script>alert('test');</script>');
var msg1= htmlEncode('<script>alert('test');</script>');
//結(jié)果變成:&lt;script&gt;alert('test');&lt;/script&gt;

2.2 后端過(guò)濾

2.2.1 java 一些框架自動(dòng)工具類(lèi),

比如:org.springframework.web.util.HtmlUtils

public static void main(String[] args) {
    String content = "<script>alert('test');</script>";
    System.out.println("content="+content);
    content = HtmlUtils.htmlEscape(content);
    System.out.println("content="+content);
    content = HtmlUtils.htmlUnescape(content);
    System.out.println("content="+content);
}

但這樣有個(gè)問(wèn)題,就是它全部的html標(biāo)簽都不解析了。

可能這不是你想要的,你想要的是一部分解析,一部分不解析。好看下面。

2.2.2 自己用正則來(lái)完成你的需求

package top.lrshuai.blog.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 
 * @author lrshuai
 * @since 2017-10-13
 * @version 0.0.1
 */
public class HTMLUtils {
/**
 * 過(guò)濾所有HTML 標(biāo)簽
 * @param htmlStr
 * @return
 */
public static String filterHTMLTag(String htmlStr) {
    //定義HTML標(biāo)簽的正則表達(dá)式 
    String reg_html="<[^>]+>"; 
    Pattern pattern=Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE); 
    Matcher matcher=pattern.matcher(htmlStr); 
    htmlStr=matcher.replaceAll(""); //過(guò)濾html標(biāo)簽 
    return htmlStr;
}
/**
 * 過(guò)濾標(biāo)簽,通過(guò)標(biāo)簽名
 * @param htmlStr
 * @param tagName
 * @return
 */
public static String filterTagByName(String htmlStr,String tagName) {
    String reg_html="<"+tagName+"[^>]*?>[\\s\\S]*?<\\/"+tagName+">";
    Pattern pattern=Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE); 
    Matcher matcher=pattern.matcher(htmlStr); 
    htmlStr=matcher.replaceAll(""); //過(guò)濾html標(biāo)簽 
    return htmlStr;
}
/**
 * 過(guò)濾標(biāo)簽上的 style 樣式
 * @param htmlStr
 * @return
 */
public static String filterHTMLTagInStyle(String htmlStr) {
    String reg_html="style=('|\")(.*?)('|\")";
    Pattern pattern=Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE); 
    Matcher matcher=pattern.matcher(htmlStr); 
    htmlStr=matcher.replaceAll(""); //過(guò)濾html標(biāo)簽 
    return htmlStr;
}
/**
 * 替換表情
 * @param htmlStr
 * @param tagName
 * @return
 */
public static String replayFace(String htmlStr) {
    String reg_html="\\[em_\\d{1,}\\]";
    Pattern pattern =Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE); 
    Matcher matcher=pattern.matcher(htmlStr);
    if(matcher.find()) {
        matcher.reset();
        while(matcher.find()) {
            String num = matcher.group(0);
            String number=num.substring(num.lastIndexOf('_')+1, num.length()-1);
            htmlStr = htmlStr.replace(num, "<img src='/face/arclist/"+number+".gif' border='0' />");
        }
    }
    return htmlStr;
}
    public static void main(String[] args) {
        String html = "<script>alert('test');</script><img src='/face/arclist/5.gif' border='0' /><div style='position:fixs;s'></div><style>body{color:#fff;}</style><Style>body{color:#fff;}</Style><STYLE>body{color:#fff;}</STYLE>";
        System.out.println("html="+html);
        html = HTMLUtils.filterTagByName(html, "style");
        System.out.println("html="+html);
        html = HTMLUtils.filterTagByName(html, "script");
        System.out.println("html="+html);
        html = HTMLUtils.filterHTMLTagInStyle(html);
        System.out.println("html="+html);
    }
}

java 過(guò)濾特殊字符串升級(jí)版

ASCII碼中除了32之外還有160這個(gè)特殊的空格 db中的空格 不間斷空格->頁(yè)面上的&nbsp所產(chǎn)生的空格;

 /**
     * 過(guò)濾特殊字符
     * @param str
     * @return
     *
     * \u00A0 特殊的空格
     */
    public static String stringFilter (String str){
        String regEx="[\\u00A0\\s\"`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“'。,、?]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.replaceAll("").trim();
    }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在java中獲取List集合中最大的日期時(shí)間操作

    在java中獲取List集合中最大的日期時(shí)間操作

    這篇文章主要介紹了在java中獲取List集合中最大的日期時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 詳解Vue響應(yīng)式的部分實(shí)現(xiàn)

    詳解Vue響應(yīng)式的部分實(shí)現(xiàn)

    響應(yīng)式,簡(jiǎn)單來(lái)說(shuō)當(dāng)數(shù)據(jù)發(fā)生變化時(shí),對(duì)數(shù)據(jù)有依賴的代碼會(huì)重新執(zhí)行。這篇文章主要為大家介紹了Vue中響應(yīng)式的部分實(shí)現(xiàn),感興趣的可以了解一下
    2022-12-12
  • SpringBoot的Security和OAuth2的使用示例小結(jié)

    SpringBoot的Security和OAuth2的使用示例小結(jié)

    這篇文章主要介紹了SpringBoot的Security和OAuth2的使用,本文通過(guò)示例圖文相結(jié)合給大家講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Spring與Hibernate整合事務(wù)管理的理解

    Spring與Hibernate整合事務(wù)管理的理解

    這篇文章主要介紹了Spring與Hibernate整合事務(wù)管理的理解的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • java中redis增刪查以及清理緩存的案例

    java中redis增刪查以及清理緩存的案例

    這篇文章主要介紹了java中redis增刪查以及清理緩存的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java中的Io(input與output)操作總結(jié)(二)

    java中的Io(input與output)操作總結(jié)(二)

    這一節(jié)我們來(lái)討論關(guān)于文件自身的操作包括:創(chuàng)建文件對(duì)象、創(chuàng)建和刪除文件、文件的判斷和測(cè)試、創(chuàng)建目錄、獲取文件信息、列出文件系統(tǒng)的根目錄、列出目錄下的所有文件,等等,感興趣的朋友可以了解下
    2013-01-01
  • springboot常用語(yǔ)法庫(kù)的基本語(yǔ)法

    springboot常用語(yǔ)法庫(kù)的基本語(yǔ)法

    FreeMarker 是一款?模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來(lái)生成輸出文本(HTML網(wǎng)頁(yè),電子郵件,配置文件,源代碼等)的通用工具,這篇文章主要介紹了springboot常用語(yǔ)法庫(kù)的基本語(yǔ)法,需要的朋友可以參考下
    2022-12-12
  • Feign實(shí)現(xiàn)多文件上傳,Open?Feign多文件上傳問(wèn)題及解決

    Feign實(shí)現(xiàn)多文件上傳,Open?Feign多文件上傳問(wèn)題及解決

    這篇文章主要介紹了Feign實(shí)現(xiàn)多文件上傳,Open?Feign多文件上傳問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring boot 配置多個(gè)redis的方法示例

    Spring boot 配置多個(gè)redis的方法示例

    這篇文章主要介紹了Spring boot 配置多個(gè)redis的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 解決微服務(wù)下Mybatis?xml無(wú)效綁定問(wèn)題及分析Invalid?bound?statement

    解決微服務(wù)下Mybatis?xml無(wú)效綁定問(wèn)題及分析Invalid?bound?statement

    這篇文章主要介紹了解決微服務(wù)下Mybatis?xml無(wú)效綁定問(wèn)題及分析Invalid?bound?statement,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評(píng)論