zouyu
4 天以前 e1284aa3b1b400ecebb59126d7110a3bb4a6b000
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
package com.ruoyi.common.utils.http;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 * 请求参数特殊字符转义工具类
 * 用于处理HTTP请求参数中的特殊字符,防止XSS攻击和参数解析错误
 */
public class ParameterEscaperUtil {
    // 特殊字符转义映射表
    private static final Map<Character, String> ESCAPE_MAP;
    // 转义字符反转映射表
    private static final Map<String, Character> UNESCAPE_MAP;
    
    static {
        // 初始化转义映射
        ESCAPE_MAP = new HashMap<>();
        ESCAPE_MAP.put('&', "&amp;");
        ESCAPE_MAP.put('<', "&lt;");
        ESCAPE_MAP.put('>', "&gt;");
        ESCAPE_MAP.put('"', "&quot;");
        ESCAPE_MAP.put('\'', "&#39;");
        ESCAPE_MAP.put('/', "&#47;");
        ESCAPE_MAP.put('\\', "&#92;");
        ESCAPE_MAP.put(' ', "%20");
        ESCAPE_MAP.put('?', "%3F");
        ESCAPE_MAP.put('=', "%3D");
        ESCAPE_MAP.put('+', "%2B");
        ESCAPE_MAP.put('%', "%25");
        ESCAPE_MAP.put('#', "%23");
        ESCAPE_MAP.put(':', "%3A");
        ESCAPE_MAP.put(';', "%3B");
        
        // 初始化反转义映射
        UNESCAPE_MAP = new HashMap<>();
        for (Map.Entry<Character, String> entry : ESCAPE_MAP.entrySet()) {
            UNESCAPE_MAP.put(entry.getValue(), entry.getKey());
        }
    }
    
    /**
     * 转义请求参数中的特殊字符
     * @param input 原始输入字符串
     * @return 转义后的字符串
     */
    public static String escape(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }
        
        StringBuilder sb = new StringBuilder();
        for (char c : input.toCharArray()) {
            // 如果是需要转义的字符,则使用转义后的字符串,否则直接添加
            String escaped = ESCAPE_MAP.get(c);
            sb.append(escaped != null ? escaped : c);
        }
        return sb.toString();
    }
    
    /**
     * 反转义请求参数中的特殊字符
     * @param input 转义后的字符串
     * @return 原始字符串
     */
    public static String unescape(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }
        
        StringBuilder sb = new StringBuilder();
        int i = 0;
        while (i < input.length()) {
            boolean found = false;
            // 检查是否是转义序列
            for (String escapeSeq : UNESCAPE_MAP.keySet()) {
                if (input.startsWith(escapeSeq, i)) {
                    sb.append(UNESCAPE_MAP.get(escapeSeq));
                    i += escapeSeq.length();
                    found = true;
                    break;
                }
            }
            if (!found) {
                sb.append(input.charAt(i));
                i++;
            }
        }
        return sb.toString();
    }
}