MyBatis 和 SQL 注入的恩恩怨怨
本文首发于安全客平台 MyBatis 是一种持久层框架,介于 JDBC 和 Hibernate 之间。通过 MyBatis 减少了手写 SQL 语句的痛苦,使用者可以灵活使用 SQL 语句,支持高级映射。但是 MyBatis 的推出不是只是为了安全问题,有很多开发认为使用了 MyBatis 就不会存在 SQL 注入了,真的是这样吗?使用了 MyBatis 就不会有 SQL 注入了吗?答案很明显是 NO。 MyBatis 它只是一种持久层框架,它并不会为你解决安全问题。当然,如果你能够遵循规范,按照框架推荐的方法开发,自然也就避免 SQL 注入问题了。本文就将 MyBatis 和 SQL 注入这些恩恩怨怨掰扯掰扯。(注本文所说的 MyBatis 默认指的是 MyBatis3) 起源 写本文的起源主要是来源于内网发现的一次 SQL 注入。我们发现内网的一个请求的 keyword 参数存在 SQL 注入,简单地介绍一下需求背景。基本上这个接口就是实现多个字段可以实现 keyword 的模糊查询,这应该是一个比较常见的需求。只不过这里存在多个查询条件。经过一番搜索,我们发现问题的核心处于以下代码: public Criteria addKeywordTo(String keyword) { StringBuilder sb = new StringBuilder(); sb.append("(display_name like '%" + keyword + "%' or "); sb.append("org like '" + keyword + "%' or "); sb.