前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口设计动态sql的一些思考

接口设计动态sql的一些思考

原创
作者头像
查拉图斯特拉说
发布2024-02-06 23:42:47
1020
发布2024-02-06 23:42:47
举报
文章被收录于专栏:后端架构后端架构

前言

这个章节主要是在讲日常我们在进行一个SQL拼写的时候,需要注意的一些点有可能导致一个SQL注入。尤其是一些对表格进行排序的一些动态操作。因为之前没有想到一些好的方式,所以就进行了一个SQL属性传参数的编写。可以做到动态SQL对接口参数很友好,但是对安全性不友好。

发现问题

拿一段之前的排序的代码,但我之前发现老感觉哪里有问题,那么就以这段代码为依据,进行注入测试,

代码语言:javascript
复制
if (StringUtils.isNotEmpty(order) && StringUtils.isNotEmpty(sort)) {
    sql.append(" ORDER BY ").append(order).append(" ").append(sort);
} else {
    sql.append(" ORDER BYid ");
}

SQL

这是一种非常常见的对结果进行一个排序的SQL。我们运用一个注入进行一个自查询的操作。这个时候从某种程度上已经已经体现了注入的逻辑。

对参数进行传参create_time; SELECT pg_sleep(15),拼接后的SQL如下所示,从结果来看,某种程度上来说,已经代表注入成功了。因为从执行逻辑日志来看执行了10多秒。

代码语言:javascript
复制
// 原始的sql
SELECT * FROM table  ORDER BY ?

//注入后的sql
SELECT * FROM table  ORDER BY create_time;  SELECT pg_sleep(15)

猜想

在这里我猜想的是,如果我注入的时候,我拼接了一段Delete的语句,那是不是基本上可以完成达到或注入的一个目的?

delete from test_task

代码

虽然从代码层面上来说,它会提示异常报错。是他真真正正执行了15秒。对数据库而言还是非常危险的,相当于我把一些可配置的SQL暴露出来了。

查询传回多个 ResultSet

代码语言:javascript
复制
2024-02-06 15:43:19.030 []  INFO ${sys:PID} --- [           main] c.t.o.p.c.DAO                            : Exception: Sql error:

org.postgresql.util.PSQLException: 查询传回多个 ResultSet。
	at org.postgresql.jdbc.PgStatement.getSingleResultSet(PgStatement.java:255) ~[postgresql-42.3.6.jar:42.3.6]
	at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:123) ~[postgresql-42.3.6.jar:42.3.6]
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-4.0.3.jar:?]

从代码的日志上面来看。确实执行了有十多秒。注入已经算是实现了。

再次测试

后面我又发现了一个排序的SQL。但是这个SQL只针对了属性名做了一个注入。虽然说这次注入不是很成功,因为我本身也不是,做攻击的老手,所以抛出这个问题,希望哪位大佬看到了可以解释一下如何去注入。

代码语言:javascript
复制
select * from test_task order by  ?  desc

进行注入

这是一段我进行一个注入的片段。看过网上的一些介绍有一些人做了一些子查询,然后再进行一个临时表的一个封装。可以进行一个union但这还需要前面部分SQL的支持,所以今天只是简单举一个这个方向的例子吧。

id desc union select * from test_task where id=-1 order by id

一开始我打算去用多表关联的方式。然后再用union统一结果集这样的话,查到的结果的话,我始终是一个结果集。因为如果分号分隔的方式,它还是会返回多个结果集。执行产生了一个异常达不到我要的效果,再者的话就是这个后缀DES它影响了我后续的一个注入,所以这是一个麻烦的问题。

总结

这种写法如果对传入的SQL进行严格的限制。还是可以起到一定的规避作用,因为本身如果对属性进行一个排序的话,对正序倒序的属性进行一个写死操作。注入也是比较难的,你不能说他全部错误,但是站在我的角度,我还是认为他比较怪怪的,我不太喜欢,因为会导致SQL异常,错误全到DB了。

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 发现问题
    • SQL
      • 猜想
        • 代码
          • 查询传回多个 ResultSet
          • 再次测试
          • 进行注入
          • 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档