冯嘉润 刘颖
关键词:微信云数据库;Java;SQL语句;SQL注入;多线程
0 引言
随着微信小程序的不断普及,小程序也成为众多开发者的开发目标。而在开发小程序的同时,也会用到和小程序相对应的微信云数据库用来存储小程序的数据信息[1],此时为了能够更好地统计和处理这些数据,通常会使用第三方的系统平台来对这些数据进行处理。但是目前官方并未提供对微信云数据库操作的Java工具类,这让开发者在处理微信云中的数据需要自己手动去封装这些接口[2]从而导致开发效率的降低。同时,开发过程可能也会由于开发者的疏忽导致编码的安全性不高引发不必要的安全漏洞。
通过Java开发一款可以直接调用工具内方法操作微信云数据库的Jar包工具。用户可以直接通过调用包内的方法传入对应的SQL语句参数即可由工具代替用户用已经封装好的方法请求微信云数据对应的接口并获取相应的返回数据,同时为了让系统不受字符拼接导致的SQL 注入[3],工具会对用户传入的SQL语句进行特殊字符的过滤处理来保证系统的安全性[4]。
1 需求分析
该工具需要实现对云数据库的操作,并打包成可以隨时调用的Java归档程序。为了能够让用户更加简单地使用该工具,用户使用前需要提供微信云数据库的资源ID、账号、密钥,由本工具的云数据库初始化方法代替用户对云数据库的初始化来获取数据库的连接实例。对数据的操作一般有四种情况,即增删改查操作,所以该工具需要提供对云数据库增删改查的方法,为了防止有其他的操作情况如事务、回滚等,本工具还需提供一个可以执行任意SQL的方法来满足用户需求。同时为了保证系统的安全性和SQL语句的唯一语义性,需要对传入的SQL语句进行安全性检测与过滤。为了方便开发者能够快速地定位自己的错误,工具需要提供对SQL语句执行情况以及执行结果的日志记录功能以方便后续开发者能够快速地分析和定位错误。
综上所述,该工具主要提供了初始化微信云数据库实例的方法,执行增、删、改、查和执行任意SQL语句的方法和对SQL 语句的安全性校验的方法以及SQL日志记录的功能。
2 技术选型
该工具采用Java语言开发,使用正则表达式对输入的SQL语句进行特殊字符过滤以确保输入的SQL语句是合法且不具有危险性的语句来防止SQL注入。工具使用到了Apache Jakarta Common 的子项目Apache HttpClient包作为底层发起网络请求和获得请求结果[5]的工具,由用户输入SQL语句之后调用本工具封装好的网络请求方法来获得SQL语句执行结果。执行结果使用到了JSONObject类对其进行JSON的解析与格式化[6],JSON格式化完毕之后即可通过数组访问的方法来获取指定的执行结果。最后使用Java 命令将该工具打包成可直接调用的Jar包[7],方便其他用户使用该工具。
3 设计与实现
3.1 工具功能设计
根据需求分析,该工具需实现基本的增删改查功能和任意SQL语句执行方法来方便开发者直接调用。大致确认该工具功能分为“添加SQL语句执行方法”“删除SQL语句执行方法”“更新SQL语句执行方法”“查询SQL语句执行方法”“任意SQL语句执行方法”“日志记录”。确定该工具的功能结构如图1。
3.2 工具功能实现
为了达到通过请求微信云数据库接口来操作数据,主要需要实现以下功能:通过发起Apache HttpCli⁃ent包封装的方法中的Post请求来发送对微信云数据库初始化以及操作的请求。在底层为了提高SQL语句的执行效率采用多线程的方式去发起网络请求来执行SQL语句。为保障系统数据的安全性,需要采取对SQL语句的安全性校验。大致确认工具功能需要实现以下三点:“发起Post请求”“SQL语句安全性校验”“多线程执行SQL语句”。
3.2.1 发起Post 请求
该工具需要发起对微信云数据库操作接口的网络请求和接收返回数据,此时需要用到Apache 的HttpCilent包请求微信云数据库的操作接口,关键代码如下:
当工具可以正常发起POST请求时,首先需要通过POST请求向微信云数据库发送一个包含云数据库ID、密钥、账号的验证信息来获取Token(身份临时认证信息),拥有Token之后才能对数据库进行操作。且该Token有效期只有两个小时,那么在执行对数据库的操作之前需要对Token进行校验,如果Token失效那么需要重新获取Token,有效则直接发送操作数据库的请求,关键代码如下:
3.2.2 SQL 语句安全性过滤
数据库是Web服务中非常重要的部分,许多重要的数据都存在于数据库中。在Web漏洞中,SQL注入所占的比例是比较高的,且对服务的危害等级也是很高的,如果存在SQL注入漏洞可能会导致数据库的信息泄露和影响应用的正常使用。所以在使用SQL语句对数据库进行查询的时候需要确保所查询的SQL语句是无危害的,不会导致除原本SQL语义的其他语句被执行。本工具中的SQL语句采用微信云数据库的语法结构,如果未对SQL语句进行安全校验,那么原本的语义可能就会被攻击者利用注入漏洞转换为其他语义。
如原本语句为:"db. collection('admin'). where({username:'"+name+"'}).get()",传入name参数即可查询username为name的用户。如果不对输入的name参数安全校验,那么输入的name 如果为“小明",age:10"”,那么原语句的SQL语句就会变为:"db.collection('admin').where({username: "小明",age: "10"}).get()",该语句的语义就会由查询用户名为小明的用户信息变为查询用户名为小明且年龄为10岁的用户信息,原有的SQL语句的语义发生的转变,这就是字符拼接导致的SQL注入。本工具采用字符过滤的方式可以有效地避免这种漏洞,关键代码如下:
下面使用JUnit测试模块测试该方法对输入包含非法字符的SQL语句过滤效果,代码如下:
3.2.3 多线程执行SQL 语句
本工具对云数据库进行操作的原理是通过请求微信云数据库对应的API 来实现的增删改查操作。但网络操作通常比较费时,所以为提高执行效率,本工具在底层采用线程池的方式来发起网络请求,从而实现在需要调用多线程直接进行调用,省去了创建多线程耗时的过程。关键代码如下:
同时,执行的SQL语句所返回的执行结果在返回给用户的同时也会输出到控制台方便开发者能够快速地分析和定位错误,如图4。
4 结束语
该工具使用Java开发,提供了基本的微信云数据库的SQL语句执行功能、云数据库初始化功能。让开发者在对微信云数据库的第三方开发中能够更加简单便捷。使用了线程池来提高SQL语句的执行效率,在SQL执行过程中对SQL语句进行了安全校验确保SQL语句的语义一致以及云数据库的安全。同时为了方便开发者能够快速定位SQL语句,本工具会将每次执行的SQL语句以及返回结果进行输出记录。