✨前言✨
本篇文章主要在于了解SQL注入攻击原理及防御策略
🍒欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁
🍒博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言
📍文章目录📍
- 🍎一,什么是预处理?
- 🍎二,什么是SQL注入
- 🍎三,SQL 注入的原理主要有以下 4 点:
- 1,恶意拼接查询
- 2,利用注释执行非法命令。
- 3,传入非法参数
- 4,添加额外条件
- 🍎四,如何防止SQL注入
- 方案一:
- 方案二:
- 方案三:
- 🍎总结
🍎一,什么是预处理?
预处理:prepare statement,一种预先编译SQL指令的方式,预处理不同于直接处理,要将要执行的SQL指令先发送给服务器编译,然后通过指令执行 预处理:prepare statement,一种预先编译SQL指令的方式,预处理不同于直接处理,要将要执行的SQL指令先发送给服务器编译,然后通过指令执行
🍎二,什么是SQL注入
SQL 注入(SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步获取到数据信息。
简而言之,SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。
🍎三,SQL 注入的原理主要有以下 4 点:
1,恶意拼接查询
我们知道,SQL 语句可以查询、插入、更新和删除数据,且使用分号来分隔不同的命令。
例如:
SELECT * FROM users
WHERE user_id = $user_id
其中,user_id 是传入的参数,如果传入的参数值为 “1234; DELETE FROM users” ,那么最终的查询语句会变为:
SELECT * FROM users
WHERE user_id = 1234;
DELETE
FROM users
如果以上语句执行,则会删除 users 表中的所有数据。
2,利用注释执行非法命令。
SQL 语句中可以插入注释。
例如:
SELECT COUNT(*) AS 'num' FROM game_score
WHERE game_id=24411
AND version=$version
如果 version 包含了恶意的字符串 ‘-1’ OR 3 AND SLEEP(500)– ,那么最终查询语句会变为:
SELECT COUNT(*) AS 'num' FROM game_score
WHERE game_id=24411
AND version='-1' OR 3
AND SLEEP(500)--
以上恶意查询只是想耗尽系统资源,SLEEP(500) 将导致 SQL 语句一直运行。如果其中添加了修改、删除数据的恶意指令,那么将会造成更大的破坏。
3,传入非法参数
SQL 语句中传入的字符串参数是用单引号引起来的,如果字符串本身包含单引号而没有被处理,那么可能会篡改原本 SQL 语句的作用。 例如:
SELECT * FROM user_name
WHERE user_name = $user_name
如果 user_name 传入参数 值为 G’chen,那么最终的查询语句会变为:
SELECT * FROM user_name
WHERE user_name ='G'chen'
一般情况下,以上语句会执行出错,这样的语句风险比较小。虽然没有语法错误,但可能会恶意产生 SQL 语句,并且以一种你不期望的方式运行。
4,添加额外条件
在 SQL 语句中添加一些额外条件,以此来改变执行行为。条件一般为真值表达式。
例如:
UPDATE users SET userpass='$userpass'
WHERE user_id=$user_id;
如果 user_id 被传入恶意的字符串 “1234 OR TRUE” ,那么最终的 SQL 语句会变为:
UPDATE users SET userpass= '123456'
WHERE user_id=1234 OR TRUE;
这将更改所有用户的密码。
SQL注入:
通过在Web表单中插入SQL命令提交或输入域名或页面请求的查询字符串来欺骗服务器执行恶意SQL命令。
具体来说,就是利用现有应用程序将(恶意)SQL命令注入到后台数据库引擎执行中的能力,可以通过在Web表单中输入(恶意)SQL语句来获取安全漏洞网站上的数据库,而不是按照设计者的意图执行 SQL 语句。例如,以往的很多影视网站泄露VIP会员密码的方式大多是通过WEB表单提交查询字符。
网站页面包含与数据库交互的部分(如新闻网站的搜索功能),当在网站上输入数据信息时,将数据信息编程并传递给执行的数据库。对传入数据库的相应数据进行安全处理(如过滤特殊字符、编码等),使黑客可以通过网站并在数据库中执行它们。这些以黑客为目的的SQL语句会导致数据库信息的泄露和破坏。
🍎四,如何防止SQL注入
有句老话说的好,有人的地方就会有江湖。SQL注入也有这么一句老话,叫有输入的地方就可能存在SQL注入,那么我们该如何去防止SQL注入呢!SQL注入产生的原理归根结底还是用户输入的代码被数据库执行了,所以解铃还须系铃人,防御SQL注入还是要在代码层面上去解决。
方案一:
采用预编译技术
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
使用预编译的SQL语句,SQL语句的语义不会是不会发生改变的。预编译语句在创建的时候就已经将指定的SQL语句发送给了DBMS,完成了解析,检查,编译等工作,所以攻击者无法改变SQL语句的结构,只是把值赋给?,然后将?这个变量传给SQL语句。当然还有一些通过预编译绕过某些安全防护的操作,大家感兴趣可以去搜索一下。
方案二:
严格控制数据类型
在java、c等强类型语言中一般是不存在数字型注入的,因为在接受到用户输入id时,代码一般会做一个int id 的数据类型转换,假如我们输入的是字符串的话,那么这种情况下,程序就会报错。但是在PHP、ASP这些没有强调处理数据类型的语言,一般我们看到的接收id的代码都是如下等代码。
$id = $_GET['id'];
$SQL = "select * from '某字段' where id = $id;";
这样的代码攻击者就可以通过构造id参数运用联合查询等手法进行SQL注入,假如这里我们加入一个检查数字类型函数 is_numeric() 这样就可以防止数字型注入了。
方案三:
对特殊的字符进行转义
数字型注入可以通过检查数据类型防止,但是字符型不可以,那么怎么办呢,最好的办法就是对特殊的字符进行转义了。比如在MySQL中我们可以对" ’ "进行转义,这样就防止了一些恶意攻击者来闭合语句。当然我们也可以通过一些安全函数来转义特殊字符。如 addslashes() 等,但是这些函数并非一劳永逸,攻击者还可以通过一些特殊的方式绕过。
🍎总结
当然防止SQL注入的手段肯定不止这些,但因为能力有限,就先写这么多了,以后学习到了新技能在写给大家,uu们也可以自己发散思维想一想,或者百度查一查。
✨最后✨
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!
如有问题,欢迎评论区批评指正😁