JDBC入门六:SQL注入攻击:什么是SQL注入攻击?;Java中引号嵌套的分析;

本文通过一个员工查询功能的实例,详细介绍了SQL注入攻击的工作原理及其潜在风险。文章演示了如何利用特殊字符破坏原有的SQL筛选条件,并分析了在字符串拼接过程中处理不当可能导致的安全漏洞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上篇博客,沿用JDBC入门五:一个按部门查询员工功能的例子这篇博客中的案例代码;

目录

一:什么是SQL注入攻击

(1)情况阐述

(2)演示准备 

(3)启动程序,SQL注入攻击演示​

(4)分析

附:字符串拼接时:引号嵌套的分析


一:什么是SQL注入攻击

(1)情况阐述

即在这个例子中,是通过拼凑变量和字符串的方式得到最终的SQL语句的;而这种处理方式是有很大隐患的。

(2)演示准备 

如:QueryCommand类作两处更改:

(3)启动程序,SQL注入攻击演示

(4)分析

分析如下:当输入【' or 1=1 or 1='】的时候,拼凑的SQL语句为:

"select  * from employee where dname='"' or 1=1 or 1='"'"

经过java程序处理完引号嵌套后的实际为:

即where的判断条件为:dname=""  or  1=1  or  1="";因为1=1肯定为true,又因为筛选条件间是or的关系,所以,1=1让其他所有筛选条件都失效了,这个where的判断条件永远为true;

像这种,输入了特殊格式的字符,从而嵌入到原有SQL中,破坏原有SQL筛选条件的数据攻击方式,就是SQL注入攻击。

SQL注入攻击是网站或应用程序中非常常见的情况,出现的根本原因在输入的数据中,并没有对像单引号这样的特殊字符作处理,所以在进行字符串拼接后,这个单引号就会作为SQL的一部分出现,并且MySQL会对其进行解析,导致出现了注入攻击的问题。SQL注入不会破坏程序的运行,但是会造成数据的泄露!!!


附:字符串拼接时:引号嵌套的分析

声明1:WHERE子句中,判断字符串的时候就需要加引号的;如下面案例:

声明2:Java中引号嵌套的原则;

        (1)单引号内只能嵌套双引号;

        (2)双引号内只能嵌套单引号;

        (3)如果想在双引号内再嵌套双引号,里面的双引号必须要转义(\");

即,引号嵌套的时候,保持双中套单,单中套双就可以了。

分析:上面的SQL语句:

或者可以这样看:(2021-12-5)

然后,几个案例:

### MyBatis 中防止 SQL 注入的方法及案例分析开发基于 MyBatis 的应用程序时,SQL 注入是一个常见的安全威胁。为了有效防范此类攻击开发者应遵循一些最佳实践并理解其背后的原理。 #### 使用预编译语句 MyBatis 提供了内置的支持来帮助开发者构建更安全的查询逻辑。通过使用预编译语句(PreparedStatement),可以显著降低 SQL 注入的风险。预编译语句的核心在于参数化查询,即绑定变量到 SQL 查询中的占位符位置[^1]。这种方式能够确保用户输入不会被解释为 SQL 片段的一部分,从而避免恶意代码执行的可能性。 ```xml <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> ``` 上述例子展示了如何利用 `#{}` 占位符实现参数化的查询操作。`#{}` 是 MyBatis 推荐的方式之一,在内部会自动转换成 JDBC PreparedStatement 形式的参数绑定过程。 #### 避免动态拼接字符串 尽管 MyBatis 支持 `${}` 这种语法用于直接嵌套字符串值进入 SQL 表达式中,但这通常被认为是不推荐的做法,因为它容易引发 SQL 注入漏洞。如果确实需要动态生成部分条件,则应该格外小心处理传入的数据,并考虑其他替代方案如 CONCAT 函数或者严格验证外部数据的有效性和合法性后再纳入最终形成的 SQL 文本里[^2]。 例如下面这个场景可能存在问题: ```sql SELECT * FROM articles WHERE title LIKE '%${keyword}%'; ``` 这里的关键字会被直接替换进去而没有任何转义机制保护它不受潜在危险字符影响。因此建议改写如下形式以提高安全性: ```sql LIKE CONCAT('%', #{safeKeyword}, '%') ``` 其中 safeKeyword 应该经过适当清理过滤之后再传递给 mapper 方法调用. #### 处理复杂业务需求下的 WAF 绕过技巧 即使采取了以上措施,在某些特殊情况下仍然可能会遇到高级防护系统(WAF)带来的额外挑战。比如当尝试提交包含多个连续单引号(''')作为测试样例时触发错误响应或访问拒绝等问题发生时,这表明目标站点很可能部署了一层额外的安全检测规则试图阻止非法请求到达实际数据库层面之前就被拦截下来[^3].此时可考虑调整策略方向,例如采用编码变换技术或者其他间接表达手段绕开简单模式匹配型防御屏障. 另外值得注意的是,@Select注解虽然简洁方便但是缺乏灵活性尤其面对复杂的多表联查等情况往往显得力有未逮而且难以维护扩展;相比之下定义完整的XML映射文件则提供了更大的自由度同时也更容易实施全面细致的安全控制流程[^4]: ```xml <select id="dynamicQueryExample" parameterType="map" resultType="EntityClass"> SELECT * FROM some_table t1 INNER JOIN another_table t2 ON t1.id = t2.foreign_id <where> <!-- 动态添加筛选项 --> <if test="conditionA != null">AND field_a = #{conditionA}</if> <if test="conditionB != '' ">AND field_b LIKE CONCAT('%', #{conditionB}, '%')</if> </where> ORDER BY ${sortColumn} ASC -- 注意此处仍需谨慎对待来自客户端指定列名的情况 </select> ``` 此片段展示了一个较为综合的例子说明怎样合理运用标签结构组合起来满足不同条件下灵活变化的需求同时兼顾性能优化方面考量因素以及最重要的安全保障环节. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值