<转>mybatis防止sql注入

本文介绍MyBatis框架如何通过预编译SQL语句防止SQL注入,并对比#{param}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原链接:[url]http://cs-css.iteye.com/blog/1752680[/url]


sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=’1’”这样的语句,有可能入侵参数校验不足的应用程序。所以在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式。
mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候当然需要防止sql注入。其实Mybatis的sql是一个具有“输入+输出”功能,类似于函数的结构,如下:
<select id="getBlogById" resultType="Blog" parameterType=”int”>
select id,title,author,content
from blog where id=#{id}
</select>
这里,parameterType标示了输入的参数类型,resultType标示了输出的参数类型。回应上文,如果我们想防止sql注入,理所当然地要在输入参数上下功夫。上面代码中高亮部分即输入参数在sql中拼接的部分,传入参数后,打印出执行的sql语句,会看到sql是这样的:
select id,title,author,content from blog where id = ?
不管输入什么参数,打印出的sql都是这样的。这是因为mybatis启用了预编译功能,在sql执行前,会先将上面的sql发送给数据库进行编译,执行时,直接使用编译好的sql,替换占位符“?”就可以了。因为sql注入只能对编译过程起作用,所以这样的方式就很好地避免了sql注入的问题。
mybatis是如何做到sql预编译的呢?其实在框架底层,是jdbc中的PreparedStatement类在起作用,PreparedStatement是我们很熟悉的Statement的子类,它的对象包含了编译好的sql语句。这种“准备好”的方式不仅能提高安全性,而且在多次执行一个sql时,能够提高效率,原因是sql已编译好,再次执行时无需再编译。
话说回来,是否我们使用mybatis就一定可以防止sql注入呢?当然不是,请看下面的代码:
<select id="orderBlog" resultType="Blog" parameterType=”map”>
select id,title,author,content
from blog order by ${orderParam}
</select>
仔细观察,内联参数的格式由“#{xxx}”变为了${xxx}。如果我们给参数“orderParam”赋值为”id”,将sql打印出来,是这样的:
select id,title,author,content from blog order by id
显然,这样是无法阻止sql注入的。在mybatis中,”${xxx}”这样格式的参数会直接参与sql编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式,所以,这样的参数需要我们在代码中手工进行处理来防止注入。
结论:在编写mybatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.7.3</version> </parent> <groupId>com.sky</groupId> <artifactId>sky-take-out</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>sky-common</module> <module>sky-pojo</module> <module>sky-server</module> </modules> <properties> <mybatis.spring>2.2.0</mybatis.spring> <lombok>1.18.20</lombok> <fastjson>1.2.76</fastjson> <commons.lang>2.6</commons.lang> <druid>1.2.1</druid> <pagehelper>1.3.0</pagehelper> <aliyun.sdk.oss>3.10.2</aliyun.sdk.oss> <knife4j>3.0.2</knife4j> <aspectj>1.9.4</aspectj> <jjwt>0.9.1</jjwt> <jaxb-api>2.3.1</jaxb-api> <poi>3.16</poi> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.spring}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson}</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>${commons.lang}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pagehelper}</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>${knife4j}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${aspectj}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>${jjwt}</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>${aliyun.sdk.oss}</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>${jaxb-api}</version> </dependency> <!-- poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi}</version> </dependency> <!--微信支付--> <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> <version>0.4.8</version> </dependency> </dependencies> </dependencyManagement> </project> 构建 失败 WebMvcConfiguration.java 程序包lombok.extern.slf4j不存在 程序包org.springframework.beans.factory.annotation不存在 程序包org.springframework.context.annotation不存在 程序包org.springframework.context.annotation不存在 程序包org.springframework.web.servlet.config.annotation不存在 程序包org.springframework.web.servlet.config.annotation不存在 程序包org.springframework.web.servlet.config.annotation不存在 程序包springfox.documentation.builders不存在 程序包springfox.documentation.builders不存在 程序包springfox.documentation.builders不存在 程序包springfox.documentation.service不存在 程序包springfox.documentation.spi不存在 程序包springfox.documentation.spring.web.plugins不存在 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 JwtTokenAdminInterceptor.java 程序包com.sky.constant不存在 程序包com.sky.properties不存在 程序包com.sky.utils不存在 程序包io.jsonwebtoken不存在 程序包lombok.extern.slf4j不存在 程序包org.springframework.beans.factory.annotation不存在 程序包org.springframework.stereotype不存在 程序包org.springframework.web.method不存在 程序包org.springframework.web.servlet不存在 程序包javax.servlet.http不存在 程序包javax.servlet.http不存在 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 EmployeeController.java 程序包com.sky.constant不存在 程序包com.sky.dto不存在 程序包com.sky.entity不存在 程序包com.sky.properties不存在 程序包com.sky.result不存在 程序包com.sky.utils不存在 程序包com.sky.vo不存在 程序包lombok.extern.slf4j不存在 程序包org.springframework.beans.factory.annotation不存在 程序包org.springframework.web.bind.annotation不存在 程序包org.springframework.web.bind.annotation不存在 程序包org.springframework.web.bind.annotation不存在 程序包org.springframework.web.bind.annotation不存在 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 找不到符号 EmployeeService.java 程序包com.sky.dto不存在 程序包com.sky.entity不存在 找不到符号 找不到符号 GlobalExceptionHandler.java 程序包com.sky.exception不存在 程序包com.sky.result不存在 程序包lombok.extern.slf4j不存在 程序包org.springframework.web.bind.annotation不存在 程序包org.springframework.web.bind.annotation不存在 找不到符号 找不到符号 找不到符号 找不到符号 EmployeeMapper.java 程序包com.sky.entity不存在 程序包org.apache.ibatis.annotations不存在 程序包org.apache.ibatis.annotations不存在 找不到符号 找不到符号 EmployeeServiceImpl.java SkyApplication.java
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值