springboot中一般为了提高安全性,都会在配置文件中配置spring.datasource.druid.filters: wall,slf4j;如下图(yml文件,格式不一样):
其中,防火墙wall是用于防止sql注入的。在实际开发过程中,可能会由内部生成sql条件并需要内部注入到mapper中,此时,使用“#”占位符时,会被防火墙拦下,导致报各种错误。
经过试验,可有2种方案:1、去除配置文件中的“wall”属性,系统安全性会降低;2、将“#”占位符修改为“$”占位符,此时sql注入则不会被防火墙拦下。查阅资料知道,$做的是直接的字符串拼接,而“#”是采用占位符的方式,它会根据是否是字符型选择是否自行添加' '。
事例:
“#”占位符时,sql如下:
<select id="queryUserById" resultType="User"> <include refid="user_field"></include> where id = #{id} </select>
查询结果: “$”占位符时,sql如下:
<select id="queryUserById" resultType="User"> <include refid="user_field"></include> where id = concat("'",${id},"'") </select>
查询结果: