mybatis模糊查询防止sql注入
在sql里面处理(可能产生sql注入)
模糊查询的关键词like ,在查询输入的字符串前后加上%
例如:
SELECT * FROM User WHERE name LIKE CONCAT('%', #{name}, '%');
当name传入的值为' OR '1'='1' OR '
SELECT * FROM User WHERE name LIKE '%' OR '1'='1' OR '%'
就会产生sql注入,这和concat有关,传入的name和%没有看作一个整体,做了拼接。
先进行参数处理,再运行sql
String searchKeyword = "%" + userInput + "%";
User user = userMapper.getUserByKeyword(searchKeyword);
<select id="getUserByKeyword" parameterType="string" resultType="User">
SELECT * FROM User
WHERE name LIKE #{keyword}
</select>
在进行参数处理后,上面例子运行的sql就变成
SELECT * FROM User WHERE name LIKE '% OR ''1''=''1'' or %'
在Mysql中会对 ''来转义单引号,确保它被正确地视为字符串的一部分,而不会被误解为 SQL 语句的一部分。
为了防止 SQL 注入攻击,最好的做法是使用参数化查询 ,而不是直接将用户输入的内容拼接到 SQL 查询语句中。