前两天群里有人发了个截图,他们公司一个后台管理系统被人拖了库。查了半天,问题出在一段 MyBatis 的动态排序代码上。那哥们特别委屈:"我没拼字符串啊,我用的是 MyBatis,框架不是自带防注入吗?" 我一看代码,${orderBy} 赫然在目。他以为 MyBatis 是银弹,实际上 $ 和 # 差了一个安全分水岭。 今天聊的这个话题,但凡写过 Java Web 项目的人都会遇到。但很多人对 SQL 注入的认知停留在"用了 MyBatis 就安全了",这个想法比注入本身还危险。 一句话搞懂:# 和 $ 到底差在哪 先别急着看方案,把这个最基础的概念弄明白。 MyBatis 里写 SQL,有两种方式塞参数: -- 方式一:#{} SELECT * FROM user WHERE name = #{name} -- 方式二:${} SELECT * FROM user WHERE name = '${name}' 区别在哪?#{} 走预编译,${} 是字符串拼接。 用 #{} 的时候,MyBatis 会把 SQL 发给数据库之前,先把参数位置用 ? 占位,参数值单独传给数据库。数....
SpringBoot + 接口参数校验 + 自定义注解:防止 SQL 注入、XSS、非法枚举值
导语 在日常开发中,你是否遇到过这样的困扰: 用户输入了包含SQL注入风险的字符串,导致数据库被攻击 用户提交了包含恶意脚本的内容,导致XSS攻击 用户传入了非法的枚举值,导致业务逻辑异常 传统的校验方式往往需要在每个接口中编写大量的if-else判断,代码冗余且难以维护。今天,我们就来聊聊如何通过SpringBoot自定义注解,优雅地实现接口参数校验,一劳永逸地解决这些安全问题。 一、为什么需要参数校验? 1.1 安全威胁分析 SQL注入攻击 SQL注入是最常见的Web安全漏洞之一。攻击者通过在输入参数中插入恶意SQL代码,可以: 绕过身份验证 窃取敏感数据 修改或删除数据 执行系统命令 案例: // 危险的代码 String sql = "SELECT * FROM users WHERE username = '" + username + "'"; // 如果 username = "admin' OR '1'='1" // 实际执行的SQL:SELECT * FROM users WHERE username = 'admin' OR '1'='1' // 这将返回....
