需求:
项目使用了mybatis,想要防止xss,但是不想在后台去做html代码的转义工作,因为牵扯太多,所以就想着在数据库层面来做这个事儿。
解决办法:
1.在mysql添加一个自定义函数来转义html代码
2.修改mybatis-generator源码,在所有insert和update的地方加上自定义转义函数
mybatis-generator源码修改:
1.新建一个maven工程,使用maven的Download Sources,获得mybatis-generator-core的源码。
pom.xml里面添加以下代码:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
2.把源码解压导入到工程里面,首先解决报错的地方
还有就是有依赖log4j的地方,添加以下代码获取log4j的包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
3.解决了以上问题就可以开始修改源码了
目的是修改数据入库的地方,那么就需要找到所有update和insert的地方,查看源码的结构,很容就找到了生成xmlmapper的类,需要修改的类如下图:
随便挑一个类出来看看,很容易就发现了如下图所示的地方是mybatis-generate生成的xml传参的地方
跟踪代码进去,有木有很熟悉
没错,这就是mybatis的xmlmapper里面的代码
因此,只需要在这里把自定义的转义函数加上即可,但是不是所有类型的数据都加上,在这里项目里字符类型只用到了varchar和char型的,所以需要先定义一个函数,判断一下是varchar和char类型的数据才加上自定义函数。代码如下:
这里自定义一个工具类来做这个事儿,以后如果有其它需要改动的地方也可以加到工具类里,同时也方便统一修改。然后找到需要修改的地方调用一下工具类的函数即可,如下图:
其它几个类找到
valuesClause.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn));
或者
sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, “record.”));
或者
sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn));
修改之即可。
修改之后生成的代码如下图所示:
修改源码工作完成,然后找到编译过后的class文件,替换掉原来jar包里面对应的class即可,同时别忘了把工具类扔到原来的jar里。
至此,源码修改工作完成,有什么不对的地方欢迎大家斧正,由于对Mybatis-generate不熟悉,所以可能还会有更高效的也欢迎大家不吝赐教,另外,Mybatis-generate可以自定义插件,不知道能不能在插件里完成这个事儿呢,有空可以研究研究。