package com.jcdm.common.utils.sql; import com.jcdm.common.exception.UtilException; import com.jcdm.common.utils.StringUtils; /** * sqlæ“作工具类 * * @author jc */ public class SqlUtil { /** * 定义常用的 sqlå…³é”®å— */ public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; /** * 仅支æŒå—æ¯ã€æ•°å—ã€ä¸‹åˆ’线ã€ç©ºæ ¼ã€é€—å·ã€å°æ•°ç‚¹ï¼ˆæ”¯æŒå¤šä¸ªå—段排åºï¼‰ */ public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; /** * é™åˆ¶orderBy最大长度 */ private static final int ORDER_BY_MAX_LENGTH = 500; /** * 检查å—符,防æ¢æ³¨å…¥ç»•è¿‡ */ public static String escapeOrderBySql(String value) { if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { throw new UtilException("å‚æ•°ä¸ç¬¦åˆè§„范,ä¸èƒ½è¿›è¡ŒæŸ¥è¯¢"); } if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) { throw new UtilException("å‚数已超过最大é™åˆ¶ï¼Œä¸èƒ½è¿›è¡ŒæŸ¥è¯¢"); } return value; } /** * éªŒè¯ order by è¯æ³•æ˜¯å¦ç¬¦åˆè§„范 */ public static boolean isValidOrderBySql(String value) { return value.matches(SQL_PATTERN); } /** * SQL关键å—检查 */ public static void filterKeyword(String value) { if (StringUtils.isEmpty(value)) { return; } String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); for (String sqlKeyword : sqlKeywords) { if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { throw new UtilException("å‚æ•°å˜åœ¨SQL注入风险"); } } } }