EscapeUtil.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package com.ruoyi.common.utils.html;
  2. import com.ruoyi.common.utils.StringUtils;
  3. /**
  4. * 转义和反转义工具类
  5. *
  6. * @author ruoyi
  7. */
  8. public class EscapeUtil
  9. {
  10. public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
  11. private static final char[][] TEXT = new char[64][];
  12. static
  13. {
  14. for (int i = 0; i < 64; i++)
  15. {
  16. TEXT[i] = new char[] { (char) i };
  17. }
  18. // special HTML characters
  19. TEXT['\''] = "&#039;".toCharArray(); // 单引号
  20. TEXT['"'] = "&#34;".toCharArray(); // 双引号
  21. TEXT['&'] = "&#38;".toCharArray(); // &符
  22. TEXT['<'] = "&#60;".toCharArray(); // 小于号
  23. TEXT['>'] = "&#62;".toCharArray(); // 大于号
  24. }
  25. /**
  26. * 转义文本中的HTML字符为安全的字符
  27. *
  28. * @param text 被转义的文本
  29. * @return 转义后的文本
  30. */
  31. public static String escape(String text)
  32. {
  33. return encode(text);
  34. }
  35. /**
  36. * 还原被转义的HTML特殊字符
  37. *
  38. * @param content 包含转义符的HTML内容
  39. * @return 转换后的字符串
  40. */
  41. public static String unescape(String content)
  42. {
  43. return decode(content);
  44. }
  45. /**
  46. * 清除所有HTML标签,但是不删除标签内的内容
  47. *
  48. * @param content 文本
  49. * @return 清除标签后的文本
  50. */
  51. public static String clean(String content)
  52. {
  53. return new HTMLFilter().filter(content);
  54. }
  55. /**
  56. * Escape编码
  57. *
  58. * @param text 被编码的文本
  59. * @return 编码后的字符
  60. */
  61. private static String encode(String text)
  62. {
  63. if (StringUtils.isEmpty(text))
  64. {
  65. return StringUtils.EMPTY;
  66. }
  67. final StringBuilder tmp = new StringBuilder(text.length() * 6);
  68. char c;
  69. for (int i = 0; i < text.length(); i++)
  70. {
  71. c = text.charAt(i);
  72. if (c < 256)
  73. {
  74. tmp.append("%");
  75. if (c < 16)
  76. {
  77. tmp.append("0");
  78. }
  79. tmp.append(Integer.toString(c, 16));
  80. }
  81. else
  82. {
  83. tmp.append("%u");
  84. if (c <= 0xfff)
  85. {
  86. // issue#I49JU8@Gitee
  87. tmp.append("0");
  88. }
  89. tmp.append(Integer.toString(c, 16));
  90. }
  91. }
  92. return tmp.toString();
  93. }
  94. /**
  95. * Escape解码
  96. *
  97. * @param content 被转义的内容
  98. * @return 解码后的字符串
  99. */
  100. public static String decode(String content)
  101. {
  102. if (StringUtils.isEmpty(content))
  103. {
  104. return content;
  105. }
  106. StringBuilder tmp = new StringBuilder(content.length());
  107. int lastPos = 0, pos = 0;
  108. char ch;
  109. while (lastPos < content.length())
  110. {
  111. pos = content.indexOf("%", lastPos);
  112. if (pos == lastPos)
  113. {
  114. if (content.charAt(pos + 1) == 'u')
  115. {
  116. ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
  117. tmp.append(ch);
  118. lastPos = pos + 6;
  119. }
  120. else
  121. {
  122. ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
  123. tmp.append(ch);
  124. lastPos = pos + 3;
  125. }
  126. }
  127. else
  128. {
  129. if (pos == -1)
  130. {
  131. tmp.append(content.substring(lastPos));
  132. lastPos = content.length();
  133. }
  134. else
  135. {
  136. tmp.append(content.substring(lastPos, pos));
  137. lastPos = pos;
  138. }
  139. }
  140. }
  141. return tmp.toString();
  142. }
  143. public static void main(String[] args)
  144. {
  145. String html = "<script>alert(1);</script>";
  146. String escape = EscapeUtil.escape(html);
  147. // String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>";
  148. // String html = "<123";
  149. // String html = "123>";
  150. System.out.println("clean: " + EscapeUtil.clean(html));
  151. System.out.println("escape: " + escape);
  152. System.out.println("unescape: " + EscapeUtil.unescape(escape));
  153. }
  154. }