Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

基于此提出的一些问题 #16

Closed
lonecloud opened this issue Jan 13, 2018 · 6 comments
Closed

基于此提出的一些问题 #16

lonecloud opened this issue Jan 13, 2018 · 6 comments
Labels

Comments

@lonecloud
Copy link

  1. 采用本框架是否会影响到项目性能
  2. 由于本框架采用的是直接拼接sql,会不会导致有sql注入的危险?
@TommyLemon
Copy link
Collaborator

TommyLemon commented Jan 13, 2018

1.APIJSON做了 预编译、前置主键条件、前置外键条件、前置 AND 条件、字段限制(可选)、读写限流、查询缓存、查询预判(total <= count*page则不继续查数据库;id和id{}都存在时判断id{}是否包含id;检测和预估 ArrayList 初始化容量减少扩容) 等各种优化:
单表查询、不关联的多表查询、非数组内多表关联查询 都比不做优化的传统方式(SELECT *、没有内存缓存等)性能高;数组内表关联查询性能也能达到中等偏下开发者的水平。
但在一些数组与对象多层嵌套的复杂查询下,性能只能达到比初级开发稍高的水平,比不上针对性的优化。

更新:已提供自动化 JOIN ,可在部分场景下显著提升性能

2.APIJSON做了很方便的 角色权限控制 和 对非开放请求的结构及内容校验 等机制,再加上AbstractSQLConfig拼接SQL语句时对WHERE条件的优化,一般的注入方式是过不了安全机制的。
例如 1' OR 1='1 恒成立条件、 -- 注释 都不可能绕过 id 的范围,因为Structure内对id的类型要求是Long,
注入的语句是String,所以会throw IllegalArgumentException。
在AbstractSQLConfig拼接WHERE时,APIJSON会优先把id取出并放在最前面,然后用AND连接后面的条件,最终是 WHERE (id = '1') AND (其它条件) 这样的语句。
即便在 其它条件 里把范围放大至无限大(恒成立表达式等),最终WHERE仍然能控制在id范围内。
其实这还是一种性能优化,因为id是主键,放在最前面能被MySQL引擎使用并加快查询速度。

关于APIJSON的安全性,还可以看看这个ISSUE:
#12

@TommyLemon
Copy link
Collaborator

如果对安全要求很高,可以在DemoSQLExecutor使用阿里Druid等数据库连接工具来防SQL注入
https://github.com/alibaba/druid

@TommyLemon
Copy link
Collaborator

@lonecloud 已使用预编译全面防SQL注入,感谢支持^_^
https://github.com/TommyLemon/APIJSON/releases/tag/2.4.0

@TommyLemon TommyLemon added the Question 使用问题 使用问题 label Jun 19, 2018
@TommyLemon
Copy link
Collaborator

@lonecloud
已支持自动化的 join。
例如
Moment INNER JOIN User LEFT JOIN Comment:

"[]":{
   "join": "&/User/id@,</Comment/momentId@",
   "Moment":{},
   "User":{
     "name?":"t",
     "id@": "/Moment/userId"
   },
   "Comment":{
     "momentId@": "/Moment/id"
   }
}

详情见 通用文档/3.2 功能符/数组关键词 中的 join,感谢支持^_^
https://github.com/TommyLemon/APIJSON/blob/master/Document.md#3.2

@TommyLemon
Copy link
Collaborator

TommyLemon commented Jun 4, 2019

有了各种零代码的 JOIN(包括 APP JOIN 全都是零代码)后,比起最上面回答的性能,APIJSON 的查询性能已经提高了一个层级了

@TommyLemon
Copy link
Collaborator

腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事
https://zhuanlan.zhihu.com/p/447844661

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants