`

[安全] MyBatis如何防止SQL注入

阅读更多
MyBatis如何防止SQL注入

[摘自] mybatis防止sql注入 - chaoge

 

SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者)。[摘自] SQL injection - Wikipedia

SQL注入,大家都不陌生,是一种常见的攻击方式。攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序。所以,在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性要求很高的应用中(比如银行软件),经常使用SQL语句全部替换为存储过程这样的方式,来防止SQL注入。这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式

MyBatis框架作为一款半自动化的持久层框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL注入。其实,MyBatisSQL是一个具有“输入+输出”的功能,类似于函数的结构,如下:

<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="getBlogById" resultType="Blog" parameterType=”int>

         SELECT id,title,author,content

         FROM blog

WHERE id=${id}

</select>

仔细观察,内联参数的格式由“#{xxx}”变为了“${xxx}”。如果我们给参数“id”赋值为“3”,将SQL打印出来是这样的:

SELECT id,title,author,content FROM blog WHERE id = 3

(上面的对比示例是我自己添加的,为了与前面的示例形成鲜明的对比。)

<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注入攻击。

 

[摘自] mybatis#{}${}的区别以及order by注入问题

#{}:相当于JDBC中的PreparedStatement

${}:是输出变量的值

简单说,#{}是经过预编译的,是安全的${}未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入

如果我们order by语句后用了${},那么不做任何处理的时候是存在SQL注入危险的。你说怎么防止,那我只能悲惨的告诉你,你得手动处理过滤一下输入的内容。如判断一下输入的参数的长度是否正常(注入语句一般很长),更精确的过滤则可以查询一下输入的参数是否在预期的参数集合中

分享到:
评论

相关推荐

    mybatis如何防止SQL注入

    ### MyBatis如何防止SQL注入 #### SQL注入简介与危害 SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过提交恶意的SQL代码到应用程序的输入字段中(如表单、URL等),利用这些输入来操控数据库执行非预期的...

    mybatissql_mybatis解决sql注入

    标题 "mybatissql_mybatis解决sql注入" 暗示了我们正在讨论MyBatis框架如何处理SQL注入问题。SQL注入是一种常见的安全漏洞,攻击者可以通过恶意输入篡改SQL查询,获取、修改或删除数据库中的敏感数据。MyBatis,作为...

    mybatis防止SQL注入的方法实例详解

    MyBatis 防止 SQL 注入的方法实例详解 SQL 注入是一种简单的攻击手段,但直到今天仍然十分常见。MyBatis 作为一个流行的持久层框架,如何防止 SQL 注入呢?下面我们将详细介绍 MyBatis 防止 SQL 注入的方法实例详解...

    Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍

    Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,...

    Mybatis防止sql注入的实例

    Mybatis防止sql注入的实例 Mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候当然需要防止sql注入。防止sql注入的方法有很多,例如将sql语句全部替换为存储过程的方式,但这种...

    Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.txt|Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.txt

    Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么答案 Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么答案

    springboot+mybatis+sqlserver

    【标题】"springboot+mybatis+sqlserver"是一个基于Spring Boot、MyBatis和Microsoft SQL Server构建的基础开发框架,适用于快速开发企业级应用。这个框架整合了三个关键组件,旨在简化开发流程,提高开发效率。 ...

    MyBatis连接SQLServer的小例子

    MyBatis是一款优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射,极大地简化了传统Java开发中的数据库操作。SQLServer是微软公司推出的关系型数据库管理系统,广泛应用于企业级应用开发。本教程将通过...

    java持久层框架mybatis防止sql注入的方法

    总结来说,MyBatis通过预编译的PreparedStatement有效地防止了大部分SQL注入攻击,但开发者仍需谨慎对待`${}`的使用,并在必要时进行额外的输入验证和过滤,以确保应用的安全性。在编写MyBatis的映射语句时,优先...

    详解Mybatis框架SQL防注入指南

    Mybatis框架是一个流行的...总的来说,了解Mybatis的SQL注入防护机制,并结合代码审查和测试,可以有效地防止这类安全问题的发生。在开发过程中,应始终把安全放在首位,遵循最佳实践,确保应用程序的稳定性和安全性。

    Spring Boot 整合Mybatis连接SQL Server(1)

    在本教程中,我们将深入探讨如何使用Spring Boot框架与Mybatis进行整合,以便高效地连接并操作SQL Server数据库。Spring Boot以其简洁的配置和开箱即用的特性,已经成为Java后端开发的首选。而Mybatis作为轻量级的...

    SpringMVC+Mybatis+SQLServer整合源码 含数据库文件

    SpringMVC、Mybatis和SQLServer是Java Web开发中常见的技术栈,它们分别负责不同的职责。SpringMVC作为Spring框架的一部分,是用于构建Web应用程序的模型-视图-控制器(MVC)架构。Mybatis是一个轻量级的持久层框架...

    mybatis spring sqlserver mysql

    8. **安全性**:防止SQL注入,确保分页参数经过安全验证和处理。 通过以上分析,我们可以看出MyBatis、Spring、SQL Server和MySQL在分页技术实现上的协同作用。在实际项目中,结合这些技术,开发者可以构建出高效、...

    Mybatis-SQL注入讲解及#预处理与$的区别.md

    sql注入

    mybatis之动态SQL

    MyBatis 提供了预编译的 SQL 语句和参数绑定机制,能有效防止 SQL 注入攻击。同时,合理使用 MyBatis 的缓存功能,还可以进一步提升应用性能。 总之,MyBatis 的动态 SQL 功能是其强大之处,它让 SQL 的编写更加...

    Mybatis-SQL注入讲解及#预处理与$的区别.html

    sql注入

    MyBatis动态SQL.pdf

    3. **SQL注入风险**:在使用动态SQL时,如果不正确地处理用户输入,可能会增加SQL注入的风险。 #### 六、总结与展望 MyBatis动态SQL作为一种强大的数据库操作技术,通过提供灵活的SQL模板定义方式,极大地提高了...

    面向MyBatis程序的SQL注入攻击及防御策略.pdf

    此外,Web应用系统中的安全等级制度和对请求参数的严格校验,也是防止SQL注入的关键步骤。 综上所述,本文通过对SQL注入攻击原理的分析以及MyBatis框架下的SQL注入方式的研究,提出了预防SQL注入攻击的策略和方法。...

    springboot+netty+mybatis+sqlserver

    标题 "springboot+netty+mybatis+sqlserver" 涉及到的是一个使用Spring Boot、Netty、MyBatis以及SQL Server构建的项目。这个项目可能是一个高性能、轻量级的网络通信应用,利用Spring Boot的便利性和Netty的高效...

    MyBatis动态拼接SQL

    MyBatis动态SQL不仅简化了代码,提高了可维护性,而且避免了手动拼接SQL可能导致的SQL注入风险。需要注意的是,动态SQL的性能取决于数据库的优化程度,因此在设计SQL语句时,应尽量保持简洁,避免过度复杂化。

Global site tag (gtag.js) - Google Analytics