SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的暗码';
1、使用OR关键字
用户输入' OR '1' = '1', 可将原有SQL转换为:
SELECT * FROM users WHERE username = '' OR '1' = '1' AND password = ''; 查询将返回全部用户,攻击者可以绕过身份验证。
2、使用UNION关键字
用户输入' UNION SELECT email FROM users --
可将原有SQL转换为: SELECT * FROM users WHERE username = '' UNION SELECT email FROM users -- AND password = '';
查询将返回users表中的全部email字段,攻击者可以盗取用户的电子邮件地址
修改建议:
使用参数化查询、对用户输入举行验证和转义、限定数据库权限等
2、执行由前端提供的完整SQL
服务端执行由接口参数传递的完整sql
举例阐明:
public ResultData executeSql(String sql, String limit) {
if (ObjectUtils.isEmpty(limit)) {
limit = "limit 20";
}
List linkedHashMaps = sqlScriptMapper.executeSql(sql + " " + limit);
return ResultData.data(linkedHashMaps);
}
修改意见: