`

<转>mybatis防止sql注入

 
阅读更多
原链接:http://cs-css.iteye.com/blog/1752680


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注入攻击。
分享到:
评论

相关推荐

    mybatissql_mybatis解决sql注入

    MyBatis简化了SQL操作,同时也提供了防止SQL注入的安全特性,使得开发更加高效且安全。 综上所述,MyBatis通过预编译SQL、使用参数化、提供插件支持、动态SQL构造以及通过拦截器和业务层验证等方式,有效地解决了...

    mybatis如何防止SQL注入

    #### MyBatis防止SQL注入的方法 ##### 1. 使用预编译语句(PreparedStatement) MyBatis内部使用了JDBC的PreparedStatement来实现SQL语句的预编译。这种方式可以有效防止SQL注入。具体做法是在SQL语句中使用`#{}`来...

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

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

    MyBatis-03动态SQL-01.<if>元素的使用

    3. 注意防止SQL注入,确保传入的参数经过安全过滤或转义处理。 4. 使用动态SQL时,应确保生成的SQL语句在语法上是正确的。 总之,MyBatis的`&lt;if&gt;`元素是实现动态SQL的关键工具之一,它极大地提高了SQL语句的灵活性...

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

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

    mybatis之动态SQL

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

    MyBatis 动态 SQL.7z

    - MyBatis 的动态 SQL 功能主要体现在 `&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;set&gt;`, `&lt;foreach&gt;` 这些标签中。 - 动态 SQL 可以根据变量或表达式的值来决定 SQL 语句的组成部分,避免硬编码...

    MyBatis Dynamic SQL 动态sql案例.zip

    Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常用的几个标签 2.&lt;if&gt;标签 &lt;if&gt;标签是Mabits动态SQL中最常用的一个标签之一,它的作用是根据给定条件包含或排除不同的...

    Mybatis防止sql注入的实例

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

    springboot集成mybatis动态sql.zip

    Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常用的几个标签 2.&lt;if&gt;标签 &lt;if&gt;标签是Mabits动态SQL中最常用的一个标签之一,它的作用是根据给定条件包含或排除不同的...

    Mybatis动态SQL高级映射.zip

    Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常用的几个标签 2.&lt;if&gt;标签 &lt;if&gt;标签是Mabits动态SQL中最常用的一个标签之一,它的作用是根据给定条件包含或排除不同的...

    MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据

    3. **使用预编译语句**:利用预编译语句可以有效防止SQL注入攻击。 #### 四、总结 通过上述介绍可以看出,MyBatis动态SQL是一种极其强大且灵活的特性,它能够帮助开发者更高效地处理数据库操作,并显著提高代码的...

    mybatis动态SQL练习 动态查询 动态修改.zip

    Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常用的几个标签 2.&lt;if&gt;标签 &lt;if&gt;标签是Mabits动态SQL中最常用的一个标签之一,它的作用是根据给定条件包含或排除不同的...

    MyBatis 动态 SQL:灵活而强大的查询构建器.pdf

    4. **安全防护**:MyBatis 提供了参数化查询的功能,可以有效地防止 SQL 注入攻击,保障数据安全。 #### 三、MyBatis 动态 SQL 语法 MyBatis 提供了一系列动态 SQL 元素,这些元素可以帮助开发者轻松构建复杂的 ...

    用mybatis 的sql语句操作mongodb的简易方案.zip

    Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常用的几个标签 2.&lt;if&gt;标签 &lt;if&gt;标签是Mabits动态SQL中最常用的一个标签之一,它的作用是根据给定条件包含或排除不同的...

    mybatis动态sql介绍, 要点和难点,案例代码,代码解析

    2. SQL注入:使用动态SQL时,需要注意防止SQL注入攻击。MyBatis的`&lt;where&gt;`和`&lt;trim&gt;`标签可以帮助处理这个问题。 3. 遍历处理:对于集合类型的参数,如List,需要熟练掌握`&lt;foreach&gt;`标签的使用,包括`collection`...

    动态SQL插件,提供mybatis xml SQL动态脚本添加、删除接口,达到不用重启项目,通过接口动态变更SQL的效果.zip

    Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常用的几个标签 2.&lt;if&gt;标签 &lt;if&gt;标签是Mabits动态SQL中最常用的一个标签之一,它的作用是根据给定条件包含或排除不同的...

    一款IDEA插件,可以实现生成Mysql的动态SQL,适合新手使用mybatis来写项目,加快项目落地周期.zip

    Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常用的几个标签 2.&lt;if&gt;标签 &lt;if&gt;标签是Mabits动态SQL中最常用的一个标签之一,它的作用是根据给定条件包含或排除不同的...

    基于CodeMirror5实现的mybatis+sql提示扩展功能,主要是用于在线设计开发场景中的动态sql部分.zip

    Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常用的几个标签 2.&lt;if&gt;标签 &lt;if&gt;标签是Mabits动态SQL中最常用的一个标签之一,它的作用是根据给定条件包含或排除不同的...

Global site tag (gtag.js) - Google Analytics