java开发中推荐的防御sql注入方法_sql注入都不知道怎么有效防止,肯定不是一个好的程序员...

本文揭示了SQL注入攻击的严重性,通过一个高校网课系统的案例展示了如何利用SQL注入获取所有学生数据。攻击者可以通过构造特定的SQL语句绕过参数验证,获取敏感信息甚至执行恶意操作。为防止SQL注入,文章提出了包括预编译SQL、数据类型验证、限制数据库权限、异常处理和参数过滤在内的多种防御措施。
摘要由CSDN通过智能技术生成

随着web应用开发的发展,有很多的程序员进入到这个行业中,但是这批人的技术水平和编程经验参差不齐,很多人在编写代码的时候,没有对用户输入的参数进行合法性校验,使得这成为了一个潜在的安全隐患。如果遇到技术高手,发现这个问题,他可以提交一段数据库查询脚本,获取对自己想要的数据,这就是我们说的sql Injection,即sql注入。

一 背景

某高校开发了一个网课系统,学生需在该系统中选课并完成学习,数据库中有一张表course,这张表存放着每个学生的选课信息及完成情况,具体设计如下:

数据如下:

本系统中数据库采用MySQL,通过数据库驱动Jdbc对数据库进行操作。

该系统提供了一个功能查询指定学生的课程完成情况的API接口,代码如下。

二 注入攻击演示

1. 正常情况下要查询一个学生的选课及完成情况,我们只需要传递该学生对应的ID即可。

这个sql脚本很简单,如下:

2. 看起来好像没有问题对吧,但是你信不信我通过这个接口可以拿到所有学生的数据,不信?要实现很简单,只要保证这条sql脚本where条件为真就可以了,如下脚本:

具体怎么做大呢?

也很简单,我们只需要在请求该接口的时候将studendId设置为4 or 1 = 1,这样这条sql的where条件就恒真了,sql也就等同于下面这样

请求结果如下,我们拿到了这张表的所有数据

3. 查询mysql版本号,使用union拼接sql

union select1,1,version(),1

4. 查询数据库名

union select1,1,database(),1

5. 查询mysql当前用户的所有库

union select1,1, (SELECTGROUP_CONCAT(schema_name) FROM information_schema.schemata) schemaName,1

通过上面的演示你有何感想?后背有没有阵阵发凉?

这里恐怖不仅仅是可以获取到你的所有数据,更可怕的是他还可对你的数据库进行更新、删除(删库、删表)等等操作。

三 如何防止sql注入

1. 代码中让sql预编译是最佳的防止sql注入攻击的方案

这样我们传进来的参数 4 or 1 = 1就会被当作是一个student_id,所以就不会出现sql注入了。

2. 确认每种数据的类型,比如是数字,数据库则必须使用int类型来存储

3. 规定数据长度,能在一定程度上防止sql注入

4. 严格限制数据库权限,能最大程度减少sql注入的危害

5. 避免直接响应一些sql异常信息,sql发生异常后,自定义异常进行响应

6. 过滤参数中含有的一些数据库关键词

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值