SqlInjectionUtil.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package org.jeecg.common.util;
  2. import cn.hutool.crypto.SecureUtil;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.jeecg.common.exception.JeecgBootException;
  5. import javax.servlet.http.HttpServletRequest;
  6. /**
  7. * sql注入处理工具类
  8. *
  9. * @author zhoujf
  10. */
  11. @Slf4j
  12. public class SqlInjectionUtil {
  13. /**
  14. * sign 用于表字典加签的盐值【SQL漏洞】
  15. * (上线修改值 20200501,同步修改前端的盐值)
  16. */
  17. private final static String TABLE_DICT_SIGN_SALT = "20200501";
  18. private final static String xssStr = "'|and |exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+|,";
  19. /*
  20. * 针对表字典进行额外的sign签名校验(增加安全机制)
  21. * @param dictCode:
  22. * @param sign:
  23. * @param request:
  24. * @Return: void
  25. */
  26. public static void checkDictTableSign(String dictCode, String sign, HttpServletRequest request) {
  27. //表字典SQL注入漏洞,签名校验
  28. String accessToken = request.getHeader("X-Access-Token");
  29. String signStr = dictCode + SqlInjectionUtil.TABLE_DICT_SIGN_SALT + accessToken;
  30. String javaSign = SecureUtil.md5(signStr);
  31. if (!javaSign.equals(sign)) {
  32. log.error("表字典,SQL注入漏洞签名校验失败 :" + sign + "!=" + javaSign+ ",dictCode=" + dictCode);
  33. throw new JeecgBootException("无权限访问!");
  34. }
  35. log.info(" 表字典,SQL注入漏洞签名校验成功!sign=" + sign + ",dictCode=" + dictCode);
  36. }
  37. /**
  38. * sql注入过滤处理,遇到注入关键字抛异常
  39. *
  40. * @param value
  41. * @return
  42. */
  43. public static void filterContent(String value) {
  44. if (value == null || "".equals(value)) {
  45. return;
  46. }
  47. // 统一转为小写
  48. value = value.toLowerCase();
  49. String[] xssArr = xssStr.split("\\|");
  50. for (int i = 0; i < xssArr.length; i++) {
  51. if (value.indexOf(xssArr[i]) > -1) {
  52. log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]);
  53. log.error("请注意,值可能存在SQL注入风险!---> {}", value);
  54. throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value);
  55. }
  56. }
  57. return;
  58. }
  59. /**
  60. * sql注入过滤处理,遇到注入关键字抛异常
  61. *
  62. * @param values
  63. * @return
  64. */
  65. public static void filterContent(String[] values) {
  66. String[] xssArr = xssStr.split("\\|");
  67. for (String value : values) {
  68. if (value == null || "".equals(value)) {
  69. return;
  70. }
  71. // 统一转为小写
  72. value = value.toLowerCase();
  73. for (int i = 0; i < xssArr.length; i++) {
  74. if (value.indexOf(xssArr[i]) > -1) {
  75. log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]);
  76. log.error("请注意,值可能存在SQL注入风险!---> {}", value);
  77. throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value);
  78. }
  79. }
  80. }
  81. return;
  82. }
  83. /**
  84. * @特殊方法(不通用) 仅用于字典条件SQL参数,注入过滤
  85. * @param value
  86. * @return
  87. */
  88. @Deprecated
  89. public static void specialFilterContent(String value) {
  90. String specialXssStr = " exec | insert | select | delete | update | drop | count | chr | mid | master | truncate | char | declare |;|+|";
  91. String[] xssArr = specialXssStr.split("\\|");
  92. if (value == null || "".equals(value)) {
  93. return;
  94. }
  95. // 统一转为小写
  96. value = value.toLowerCase();
  97. for (int i = 0; i < xssArr.length; i++) {
  98. if (value.indexOf(xssArr[i]) > -1 || value.startsWith(xssArr[i].trim())) {
  99. log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]);
  100. log.error("请注意,值可能存在SQL注入风险!---> {}", value);
  101. throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value);
  102. }
  103. }
  104. return;
  105. }
  106. /**
  107. * @特殊方法(不通用) 仅用于Online报表SQL解析,注入过滤
  108. * @param value
  109. * @return
  110. */
  111. @Deprecated
  112. public static void specialFilterContentForOnlineReport(String value) {
  113. String specialXssStr = " exec | insert | delete | update | drop | chr | mid | master | truncate | char | declare |";
  114. String[] xssArr = specialXssStr.split("\\|");
  115. if (value == null || "".equals(value)) {
  116. return;
  117. }
  118. // 统一转为小写
  119. value = value.toLowerCase();
  120. for (int i = 0; i < xssArr.length; i++) {
  121. if (value.indexOf(xssArr[i]) > -1 || value.startsWith(xssArr[i].trim())) {
  122. log.error("请注意,存在SQL注入关键词---> {}", xssArr[i]);
  123. log.error("请注意,值可能存在SQL注入风险!---> {}", value);
  124. throw new RuntimeException("请注意,值可能存在SQL注入风险!--->" + value);
  125. }
  126. }
  127. return;
  128. }
  129. }