作者:初始化 | 来源:互联网 | 2023-10-16 18:32
1.SQL注入
在Mybatis Mapper xml中,#变量名称创建参数化查询SQL语句,不会导致SQL注入,而$变量名称直接使用SQL指令,会导致SQL注入攻击。例如:
如果攻击者输入wang or 1=1,即可进行SQL注入。如果使用#{username},就避免该情况。区别在于#{username}是参数化查询,日志中可看出:
2018-07-17 14:59:34 -1444642 [http-apr-8080-exec-4] DEBUG - ==> Preparing: select * from db_user where username=?
2018-07-17 14:59:34 -1444643 [http-apr-8080-exec-4] DEBUG - ==> Parameters: wang(String)
2018-07-17 14:59:34 -1444646 [http-apr-8080-exec-4] DEBUG - <&#61;&#61; Total: 1
2.判断单个字符的不生效
以上当username等于"1"时,并不生效。原因&#xff1a;mybatis是用OGNL表达式来解析的&#xff0c;在OGNL的表达式中&#xff0c;&#39;1&#39;会被解析成字符&#xff0c;java是强类型的&#xff0c;char 和 一个string 会导致不等&#xff0c;所以if标签中的sql不会被解析。
解决办法1&#xff0c;使用双引号。
解决办法2&#xff0c;username!&#61;&#39;1&#39;.toString()