Skip to content

Commit 8b00c69

Browse files
committed
新增支持 CASE WHEN,例如 (CASE WHEN sex * 1 = 0 THEN '男' WHEN sex >= 1 THEN '女' ELSE '其它' END);解决通过 _key 绕过隐藏字段校验
1 parent b1522c6 commit 8b00c69

File tree

1 file changed

+48
-12
lines changed

1 file changed

+48
-12
lines changed

APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,20 @@ public abstract class AbstractSQLConfig implements SQLConfig {
129129

130130

131131
RAW_MAP = new LinkedHashMap<>(); // 保证顺序,避免配置冲突等意外情况
132+
133+
RAW_MAP.put("+", "");
134+
RAW_MAP.put("-", "");
135+
RAW_MAP.put("*", "");
136+
RAW_MAP.put("/", "");
137+
RAW_MAP.put("=", "");
138+
RAW_MAP.put("!=", "");
139+
RAW_MAP.put(">", "");
140+
RAW_MAP.put(">=", "");
141+
RAW_MAP.put("<", "");
142+
RAW_MAP.put("<=", "");
143+
RAW_MAP.put("%", "");
144+
RAW_MAP.put("(", "");
145+
RAW_MAP.put(")", "");
132146

133147
// MySQL 关键字
134148
RAW_MAP.put("AS", "");
@@ -141,6 +155,11 @@ public abstract class AbstractSQLConfig implements SQLConfig {
141155
RAW_MAP.put("NOT", "");
142156
RAW_MAP.put("VALUE", "");
143157
RAW_MAP.put("DISTINCT", "");
158+
RAW_MAP.put("CASE", "");
159+
RAW_MAP.put("WHEN", "");
160+
RAW_MAP.put("THEN", "");
161+
RAW_MAP.put("ELSE", "");
162+
RAW_MAP.put("END", "");
144163

145164
//时间
146165
RAW_MAP.put("now()", "");
@@ -1705,7 +1724,7 @@ private String[] parseArgsSplitWithComma(String param, boolean isColumn, boolean
17051724
if (ck.startsWith("`") && ck.endsWith("`")) {
17061725
origin = ck.substring(1, ck.length() - 1);
17071726
//sql 注入判断 判断
1708-
if (StringUtil.isName(origin) == false) {
1727+
if (origin.startsWith("_") || StringUtil.isName(origin) == false) {
17091728
throw new IllegalArgumentException("字符 " + ck + " 不合法!"
17101729
+ "预编译模式下 @column:\"`column0`,`column1`:alias;function0(arg0,arg1,...);function1(...):alias...\""
17111730
+ " 中所有字符串 column 都必须必须为1个单词 !");
@@ -1720,12 +1739,6 @@ else if (ck.startsWith("'") && ck.endsWith("'")) {
17201739
+ "预编译模式下 @column:\"column0,column1:alias;function0(arg0,arg1,...);function1(...):alias...\""
17211740
+ " 中字符串参数不合法,必须以 ' 开头, ' 结尾,字符串中不能包含 ' ");
17221741
}
1723-
//sql 注入判断 判断
1724-
if (origin.contains("--") || PATTERN_STRING.matcher(origin).matches() == true) {
1725-
throw new IllegalArgumentException("字符 " + ck + " 不合法!"
1726-
+ "预编译模式下 @column:\"column0,column1:alias;function0(arg0,arg1,...);function1(...):alias...\""
1727-
+ " 中所有字符串 arg 都必须不符合正则表达式 " + PATTERN_STRING + " 且不包含连续减号 -- !");
1728-
}
17291742

17301743
// 1.字符串不是字段也没有别名,所以不解析别名 2. 是字符串,进行预编译,使用getValue() ,对字符串进行截取
17311744
ckeys[i] = getValue(origin).toString();
@@ -1745,7 +1758,7 @@ else if (ck.startsWith("'") && ck.endsWith("'")) {
17451758
+ "关键字必须全大写,且以空格分隔的参数,空格必须只有 1 个!其它情况不允许空格!");
17461759
}
17471760
} else {
1748-
if (origin.startsWith("_") || origin.contains("--") || PATTERN_FUNCTION.matcher(origin).matches() == false) {
1761+
if (origin.startsWith("_") || origin.contains("--")) { // || PATTERN_FUNCTION.matcher(origin).matches() == false) {
17491762
throw new IllegalArgumentException("字符 " + ck + " 不合法!"
17501763
+ "预编译模式下 @column:\"column0,column1:alias;function0(arg0,arg1,...);function1(...):alias...\""
17511764
+ " 中所有 arg 都必须是1个不以 _ 开头的单词 或者符合正则表达式 " + PATTERN_FUNCTION + " 且不包含连续减号 -- !DISTINCT 必须全大写,且后面必须有且只有 1 个空格!其它情况不允许空格!");
@@ -1818,12 +1831,35 @@ private String praseArgsSplitWithSpace(String mkes[]) {
18181831
}
18191832

18201833
//这里为什么还要做一次判断 是因为解析窗口函数调用的时候会判断一次
1821-
if (isPrepared()) {
1822-
if (origin.startsWith("_") || origin.contains("--") || PATTERN_FUNCTION.matcher(origin).matches() == false) {
1823-
throw new IllegalArgumentException("字符 " + origin + " 不合法!"
1834+
String ck = origin;
1835+
// 如果参数包含 "`" 或 "'" ,解析字符串
1836+
if (ck.startsWith("`") && ck.endsWith("`")) {
1837+
origin = ck.substring(1, ck.length() - 1);
1838+
if (origin.startsWith("_") || StringUtil.isName(origin) == false) {
1839+
throw new IllegalArgumentException("字符 " + ck + " 不合法!"
1840+
+ "预编译模式下 @column:\"`column0`,`column1`:alias;function0(arg0,arg1,...);function1(...):alias...\""
1841+
+ " 中所有字符串 column 都必须必须为1个单词 !");
1842+
}
1843+
1844+
mkes[j] = getKey(origin).toString();
1845+
continue;
1846+
}
1847+
else if (ck.startsWith("'") && ck.endsWith("'")) {
1848+
origin = ck.substring(1, ck.length() - 1);
1849+
if (origin.contains("'")) {
1850+
throw new IllegalArgumentException("字符串 " + ck + " 不合法!"
18241851
+ "预编译模式下 @column:\"column0,column1:alias;function0(arg0,arg1,...);function1(...):alias...\""
1825-
+ " 中所有 arg 都必须是1个不以 _ 开头的单词 或者符合正则表达式 " + PATTERN_FUNCTION + " 且不包含连续减号 -- !DISTINCT 必须全大写,且后面必须有且只有 1 个空格!其它情况不允许空格!");
1852+
+ " 中字符串参数不合法,必须以 ' 开头, ' 结尾,字符串中不能包含 ' ");
18261853
}
1854+
1855+
// 1.字符串不是字段也没有别名,所以不解析别名 2. 是字符串,进行预编译,使用getValue() ,对字符串进行截取
1856+
mkes[j] = getValue(origin).toString();
1857+
continue;
1858+
}
1859+
else if (ck.contains("`") || ck.contains("'") || origin.startsWith("_") || origin.contains("--")) { // || PATTERN_FUNCTION.matcher(origin).matches() == false) {
1860+
throw new IllegalArgumentException("字符 " + origin + " 不合法!"
1861+
+ "预编译模式下 @column:\"column0,column1:alias;function0(arg0,arg1,...);function1(...):alias...\""
1862+
+ " 中所有 arg 都必须是1个不以 _ 开头的单词 或者符合正则表达式 " + PATTERN_FUNCTION + " 且不包含连续减号 -- !DISTINCT 必须全大写,且后面必须有且只有 1 个空格!其它情况不允许空格!");
18271863
}
18281864

18291865
boolean isName = false;

0 commit comments

Comments
 (0)