`
cs_css
  • 浏览: 82649 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mybatis防止sql注入

阅读更多

 

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

分享到:
评论
1 楼 bert82503 2015-06-06  
整理的不错,转了,谢啦!

相关推荐

    mybatis如何防止SQL注入

    mybatis如何防止SQL注入

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

    SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。那么mybatis是如何防止SQL注入的呢?下面脚本之家小编给大家带来了实例代码,需要的朋友参考下吧

    Mybatis防止sql注入的实例

    本文通过实例给大家介绍了Mybatis防止sql注入的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

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

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

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

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

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

    下面小编就为大家带来一篇java持久层框架mybatis防止sql注入的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    详解Mybatis框架SQL防注入指南

    主要介绍了详解Mybatis框架SQL防注入指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    浅谈mybatis中的#和$的区别 以及防止sql注入的方法

    下面小编就为大家带来一篇浅谈mybatis中的#和$的区别 以及防止sql注入的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    SpringBoot集成Mybatis实现简单的SQL注入(攻击)案例

    (1)主演示就是一张t_user表,利用常见的用户登录来模拟sql注入对后台数据的侵入 (2)数据库脚本 — postgresql DROP TABLE IF EXISTS "public"."t_user"; CREATE TABLE "public"."t_user" ( "id" int8 NOT ...

    Mybatis现学现用

    3. #方式能够很大程度防止sql注入。   4.$方式无法防止Sql注入。 5.$方式一般用于传入数据库对象,例如传入表名.   6.一般能用#的就别用$. MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 字符串...

    mybatis笔记.zip

    使用${}和#{}来插入参数,其中${}会直接替换,#{}会被预编译防止SQL注入。 5. 参数映射: 参数映射使用#{}或${}来引用参数,#{}使用PreparedStatement,$${}直接替换。 6. 结果映射: 结果映射将查询结果映射到

    mybatis知识点总结.docx

    MyBatis知识点总结 MyBatis是一款优秀的持久层框架,为Java应用程序提供了数据库访问的灵活性和高度可控性。以下是关于MyBatis的一些重要知识...使用${}和#{}来插入参数,其中${}会直接替换,#{}会被预编译防止SQL注入

    MyBatis 需要注意的地方junit注解

    #方式能够很大程度防止sql注入。 4. $方式无法防止Sql注入。 5. $方式一般用于传入数据库对象,例如传入表名. 6. 一般能用#的就别用$ MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

    springmybatis

    mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:...

    JDBC的常用方法

    1.防止SQL注入 我们在写sql语句时,为了方便可能会进行拼接字符串,这样做的弊端就是可能被sql注入攻击,解决的办法也很简单。 //获取数据库连接 Connection connection = DBUtils.getConnection(); //在写sql语句时...

    mybatis-universal-crud:基于mybatis的通用crud操作框架

    关键字转义,防止sql注入; 注解支持; 查询, 普通条件查询, 连表查询, 懒加载; 更新, 替换更新和非空字段更新; 插入, 单条插入, 批量插入,指定枚举处理, 时间处理, boolean处理; 删除, 根据主键删除; 实体字段...

    企业员工角色权限管理平台(SpringBoot2.0+Mybatis+Shiro+Vue)

    值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、...

    基于SSM的网上书店销售管理系统.zip

    安全保障:通过引入加密技术、防止SQL注入等手段,确保用户信息和交易数据的安全。本论文旨在为实际项目提供一个可行的解决方案,同时展示了SSM框架在Web应用开发中的优越性。通过对系统的分析和优化,提高了系统的...

    基于SSM的医院门诊挂号系统.zip

    安全性保障:为了确保系统的安全性,我们采取了以下措施:对用户输入的数据进行严格的验证和过滤,防止SQL注入和XSS攻击。对敏感操作(如修改密码、删除数据等)进行权限控制,确保只有具有相应权限的用户才能执行操作...

    基于SSM的图书销售管理信息系统(源码+部署说明+演示视频+源码介绍).zip

    包括前端框架(如Bootstrap、jQuery等)、后端技术栈(如Spring、Spring MVC、MyBatis等)、数据库操作(如JDBC、MyBatis映射文件等)以及安全措施(如权限控制、防止SQL注入等)。通过阅读源码介绍,开发者可以更好地理解...

Global site tag (gtag.js) - Google Analytics