yzt
2023-05-05 953cbbf76091fee9d40045f91c06daee496fe5b3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package com.hxzkoa.util;
 
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.util.StringUtils;
 
/**
 * 字符串辅助类,处理常用的字符串操作(处理特殊字符)
 * 
 */
 
public class StringUtil {
    /**
     * 缺省的字符串分割符
     */
    public static String DEFAULT_DELIM = "|";
 
    /**
     * 此方法将给出的字符串source使用delim划分为单词数组。 注意:分隔字符串中每一个 <b>(ANY) </b>的字符都作为独立的分割符。
     * <br>
     * 举个例子: <br>
     * "mofit.com.cn"用"com"分割后的结果是三个字符串"fit."、"."和"n",而不是"mofit."和".cn"。
     * 
     * @param source
     *            需要进行划分的原字符串
     * @param delim
     *            单词的分隔字符串
     * @return 划分以后的数组,如果source为null的时候返回以source为唯一元素的数组,
     *         如果delim为null则使用逗号作为分隔字符串。
     */
    public static String[] split(String source, String delim) {
        String[] wordLists;
        if (source == null) {
            wordLists = new String[1];
            wordLists[0] = source;
            return wordLists;
        }
        if (delim == null) {
            delim = DEFAULT_DELIM;
        }
        StringTokenizer st = new StringTokenizer(source, delim);
 
        int total = st.countTokens();
        wordLists = new String[total];
        for (int i = 0; i < total; i++) {
            wordLists[i] = st.nextToken();
        }
        return wordLists;
    }
 
    /**
     * 检查参数值
     * 
     * @param path
     *            log文件路径
     * @param request
     * 
     * @param specialCharacter_array
     *            特殊字符数组
     * @param str
     *            要检查的参数值
     * @return
     */
    public static boolean checkSpecialCharacter(String path, HttpServletRequest request,
            String[] specialCharacter_array, String paramName, String paramValue) {
        for (int i = 0; i < specialCharacter_array.length; i++) {
            if (paramValue.indexOf(specialCharacter_array[i]) >= 0) {
 
                // FileUtil.appendString(path,
                // LogUtil.getLog(request,paramName,paramValue));
                return true;
            }
        }
        return false;
    }
 
    /**
     * 替换特殊字符
     * 
     * @param specialCharacter_array
     * @param str
     * @return
     */
    public static String replaceSpecialCharacter(String[] specialCharacter_array, String str) {
        for (int i = 0; i < specialCharacter_array.length; i++) {
            if (str.indexOf(specialCharacter_array[i]) >= 0) {
                str = str.replace(specialCharacter_array[i], "");
            }
        }
        return str;
    }
 
    /**
     * 转义特殊字符
     * 
     * @param specialCharacter_array
     * @param str
     * @return
     */
    public static String escapeSpecialCharacter(String[] specialCharacter_array, String str) {
        for (int i = 0; i < specialCharacter_array.length; i++) {
            if (str.indexOf(specialCharacter_array[i]) >= 0) {
                str = escapeXssEncode(str);
            }
        }
        return str;
    }
 
    /**
     * 
     * 转义sql、javascript语句片段,并将容易引起xss攻击的半角字符直接替换成全角字符
     * 
     * @param value
     * @return
     */
    private static String escapeXssEncode(String value) {
        if (StringUtils.isEmpty(value))
            return value;
        String result = value;
        // 对中文参数会有影响
        /*
         * result = StringEscapeUtils.escapeHtml(value); result =
         * StringEscapeUtils.escapeSql(value); result =
         * StringEscapeUtils.escapeJavaScript(result);
         */
 
        // 避免客户端使用 encodeURI时造成中文转码异常
        /*
         * result = result.replace('\'','\'); result = result.replace('/', '/');
         */
        // ajax序列换表单时造成错误
        // result = result.replace('%', '%');
        // 有些系统参数从客户端过来的时候是通过“;”连接
        // result = result.replace(';', ';');
 
        // 直接过滤特殊字符,但有时候不能这么做。(比如有富文本编辑器时)
        result = result.replace('<', '<');
        result = result.replace('>', '>');
        result = result.replace('"', '"');
        result = result.replace('\'', '‘');// 单引号转码
        result = result.replace('(', '(');
        result = result.replace(')', ')');
        result = result.replace('&', '&');
        result = result.replace('+', '+');
        result = result.replace('#', '#');
 
        return result;
 
    }
 
    public static String removeNonBmpUnicodes(String s) {
        return null == s ? null : s.replaceAll("[^\\u0000-\\uFFFF]", "");
    }
 
    public static String replaceBlank(String str) {
        String dest = "";
        if (str != null) {
            Pattern p = Pattern.compile("\\s*|\t|\r|\n");
            Matcher m = p.matcher(str);
            dest = m.replaceAll("");
        }
        return dest;
    }
 
    /**
     * 检查字符串是否为纯数字
     * 
     * @param path
     *            log文件路径
     * @param request
     * 
     * @param specialCharacter_array
     *            特殊字符数组
     * @param str
     *            要检查的参数值
     * @return
     */
    public static boolean checkIsNumber(String param) {
        Pattern pattern = Pattern.compile("[0-9]{1,}");
        Matcher matcher = pattern.matcher((CharSequence) param);
        boolean result = matcher.matches();
        return result;
    }
 
    public static void main(String[] args) {
        System.out.println("just do \nit!");
        System.out.println(replaceBlank("just do \nit!"));
        String specialCharacters = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,|script";
        String target = "<script>";
        String[] specialCharacter_array = StringUtil.split(specialCharacters, DEFAULT_DELIM);
        System.out.println("result==>" + StringUtil.escapeSpecialCharacter(specialCharacter_array, target));
    }
}