SqlUtil.java 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package com.happy.Until;
  2. import org.apache.commons.lang.StringUtils;
  3. /**
  4. * sql操作工具类
  5. *
  6. * @author xieli
  7. */
  8. public class SqlUtil
  9. {
  10. /**
  11. * 定义常用的 sql关键字(未检测|or |and |+|user())
  12. */
  13. public static String SQL_REGEX = "extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare ";
  14. /**
  15. * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
  16. */
  17. public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
  18. /**
  19. * 限制orderBy最大长度
  20. */
  21. private static final int ORDER_BY_MAX_LENGTH = 500;
  22. /**
  23. * 检查字符,防止注入绕过
  24. */
  25. public static String escapeOrderBySql(String value)
  26. {
  27. if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
  28. {
  29. throw new RuntimeException("参数不符合规范,不能进行查询");
  30. }
  31. if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH)
  32. {
  33. throw new RuntimeException("参数已超过最大限制,不能进行查询");
  34. }
  35. return value;
  36. }
  37. /**
  38. * 验证 order by 语法是否符合规范
  39. */
  40. public static boolean isValidOrderBySql(String value)
  41. {
  42. return value.matches(SQL_PATTERN);
  43. }
  44. /**
  45. * SQL关键字检查,防止sql注入
  46. */
  47. public static void filterKeyword(String value) {
  48. if (StringUtils.isEmpty(value))
  49. {
  50. return;
  51. }
  52. String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
  53. for (String sqlKeyword : sqlKeywords)
  54. {
  55. if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
  56. {
  57. throw new RuntimeException("参数存在SQL注入风险");
  58. }
  59. }
  60. }
  61. }