Tencent / APIJSON

🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构 🏆 Real-Time coding-free, powerful and secure ORM 🚀 providing APIs and Docs without coding by Backend, and the returned JSON of API can be customized by Frontend(Client) users
http://apijson.cn
Other
17.3k stars 2.16k forks source link

[Bug] 扩展@combine,同一个key在筛选/数据体中可同时存在,两者非互斥逻辑 #698

Open jettisonJava opened 7 months ago

jettisonJava commented 7 months ago

APIJSON Version/APIJSON 版本号

6.4.0

Database Type & Version/数据库类型及版本号

达梦8

Environment/环境信息

- JDK/基础库:11.0.16
- OS/系统:windows 10
- DB/达梦8

APIAuto Screenshots/APIAuto 请求与结果完整截屏

已提PR

Current Behavior/问题描述

不应该限制combine内的key只能作为条件。
1.(原有的方式)根据条件combine拼接数据体生成筛选条件,修数据:update Table set b='2' where a='2'
{"Table":{"a":"2","b":"2","@combine":"a"}}
2.(扩展)根据条件combine+数据生成筛选条件,修数据:update Table set a='2',b='2' where a='111'
{"Table":{"a":"2","b":"2","@combine":"a:a=111"}}
可使用table:{"a":"1","@combine":"a:a=3331"}的方式对a=3331的数据修改为a=1。同时兼容旧的combine格式

Expected Behavior/期望结果

update方法应该兼容通过条件参数修改指定内容例如:update table a='1' where a='2',不应该限制combine内的key只能作为条件。

Any additional comments?/其它补充说明?

No response

TommyLemon commented 7 months ago

感谢建议和提交 PR~

如果只是这种简单的 = > < >= <= 大小比较,可以直接改用: "a{}":"=2" // 区间范围 或 "a{}":[2] // a IN(2) // 选项范围

"@combine":"a:a=111" 这种写法虽然能在兼容旧语法的情况下扩展同名 key 的条件,但不好防 SQL 注入,需要完整的复杂解析过程,才知道哪些字符是 key,哪些字符是 value,哪些字符是 比较条件,大中小括号 等,需要慎重考虑必要性和安全性等

TommyLemon commented 7 months ago

还可以用 SQL 函数或类似 SQL 函数(有括号但没有名称)的复杂条件表达式: "sex2{}": "(sex)=1"

image

http://apijson.cn/api/?send=false&type=JSON&url=http%3A%2F%2Fapijson.cn%3A8080%2Fput%2FUser&json={%22id%22:82001,%22sex%22:0,%22sex2{}%22:%22(sex)%3D1%22,%22@explain%22:true}

jettisonJava commented 7 months ago

测试了"sex2{}": "(sex)=1"的表达式,不适用于没有主键数据的更新。 另外pr的代码也测到确实存在sql注入问题。需要后续考虑一下怎么调整.

TommyLemon commented 7 months ago

强制传主键和以上问题无关,可以这样设置来放宽: DemoSQLConfig.IS_MUST_HAVE_ID_CONDITION = false