什么是SQL注入?

article/2025/9/16 21:48:50

有人的地方就有江湖,有数据库存在的地方就可能存在 SQL 注入漏洞。

什么是SQL 注入?

SQL 注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞 之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一 般用的就是 SQL 注入方法。

SQL 注入其实就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常 规代码的过程。简单来说,就是数据「越俎代庖」(yuè zǔ dài páo)做了代码才能干的 事情。这个问题的来源是,SQL 数据库的操作是通过 SQL 语句来执行的,而无论是执行代 码还是数据项都必须写在 SQL 语句之中,这就导致如果我们在数据项中加入了某些 SQL 语 句关键字(比如说 SELECT、DROP 等等),这些关键字就很可能在数据库写入或读取数据 时得到执行。

SQL 注入实例

接下来我们用代码,来实现 SQL 注入,来看一下,如何实现 SQL 注入攻击,以及 SQL 注入 的实质。

接下来展示一个正常的查询操作:

//studentDao.js
const mySql = require('mysql');
// 创建数据库连接对象
const connection = mySql.createConnection({host: "127.0.0.1",port: "3306",user: "root",password: "Welcome2duyi",database: "school"
});
connection.on('error', err => console.log(err));
// 创建 sql 语句
let name = "'熊大'"
let sql = "select * from student where name = "
// 数据库连接
connection.connect();
// 进行查询操作
connection.query(sql+name, function (err, result) {if(err) {throw err} else {console.log(result)}
})
// 数据库断开连接
connection.end();

我们通过执行 node studentDao.js 可以得到结果:

数据库内容:

这是正经的数据库操作,但是当我们的 name 是来自用户输入,那他的情况就会很多。

比如下面的操作(向数据库中插入一条数据):

//studentDao.js
// ...
// 创建 sql 语句
let name = "'Robert');drop table student;"
let sql = "insert into student (name) values("
// 数据库连接
connection.connect();
// 进行查询操作
connection.query(sql+name, function (err, result) {if(err) {throw err} else {console.log(result)}
})
// 数据库断开连接
connection.end();

由于 Node 中的 mysql 做了处理,所以可以避免这样的注入问题,给我们报了一个错误:

throw err; // Rethrow non-MySQL errors
^
Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the
right syntax to use near 'drop table student' at line 1

drop student 中存在 关键字,存在危险操作。

如果正常执行,会怎么样?

程序没有输错任何数据内容,报了一条错误,表单 student 无法找到。

这是为什么呢?问题就在于我们所插入的数据项中包含 SQL 关键字 drop table,这两个 关键字的意义是从数据库中清除一个表单。而关键字之前的 Robert');使得 SQL 执行器认 为上一命令已经结束,从而使得危险指令 drop table 得到执行。也就是说,这段包含 drop table 关键字的数据项使得原有的简单的插入姓名信息的 SQL 语句

"insert into students (name) values ('Robert')"

变为了同时包含另外一条清除表单命令的语句

"insert into students (name) values ('Robert');DROP TABLE students;--"

而 SQL 数据库执行上述操作后,students 表单被清除,因而表单无法找到,所有数据项 丢失。 通过下面的动漫图示,来再次说明 SQL 注入。

如何防止 SQL 注入

大家也许都想到了,注入问题都是因为执行了数据项中的 SQL 关键字,那么,只要检查数 据项中是否存在 SQL 关键字不就可以了么?

的确是这样,很多数据库管理系统都是采取了 这种看似方便快捷的过滤手法,但是这并不是一种根本上的解决办法,如果有个美国人 真的就叫做『Drop Table』呢?你总不能逼人家改名字吧。对于这种情况都每种数据库会 有不同的解决办法,例如 Node mySql 可以以字符串的形式提交就可以了,like this :

insert into student (name) values('drop table')

合理的防护办法有很多。

数据校验

首先,尽量避免使用常见的数据库名和数据库结构。在上面的案例中,如果表单名字并 不是 students,则注入代码将会在执行过程中报错,也就不会发生数据丢失的情况—— SQL 注入并不像大家想象得那么简单,它需要攻击者本身对于数据库的结构有足够的了解 才能成功,因而在构建数据库时尽量使用较为复杂的结构和命名方式将会极大地减少被成 功攻击的概率。

其次,使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好 的防护措施。理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避 免 SQL 注入的发生。

另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操 作,比如在上述的案例中,如果我们稍加修改,首先使用 execute()方法来保证每次执行 仅能执行一条语句,然后将数据项以参数的方式与 SQL 执行语句分离开来,就可以完全避 免 SQL 注入的问题。或者进行数据转义也是可以避免 SQL 注入。

权限限制

严格限制 Web 应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限, 从而最大限度的减少注入攻击对数据库的危害。**请记住永远不要使用超级用户或所有者 帐号去连接数据库!**当数据库被攻击时将损伤限制在当前表的范围是比较明智的选择。 通过权限限制可以防止攻击者获取数据库其它信息,甚至利用数据库执行 Shell 命令等 操作。

日志处理

当数据库操作失败的时候,尽量不要将原始错误日志返回,比如类型错误、字段不匹配 等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入。除 此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显 然,日志并不能防止任何攻击,但定期审计数据库执行日志可以跟踪是否存在应用程序正 常逻辑之外的 SQL 语句执行。日志本身没用,要查阅其中包含的信息才行。毕竟,更多 的信息总比没有要好。

最后

当然,做好数据库的备份,同时对敏感内容进行加密永远是最重要的。某些安全性问题可 能永远不会有完美的解决方案,只有我们做好最基本的防护措施,才能在发生问题的时候 亡羊补牢,保证最小程度的损失。


http://chatgpt.dhexx.cn/article/F9hbymdu.shtml

相关文章

sql注入攻击的原理(sql注入攻击防范)

SQL 注入(SQLi)是一种可执行恶意 SQL 语句的注入攻击。这些 SQL 语句可控制网站背后的数据库服务。攻击者可利用 SQL 漏洞绕过网站已有的安全措施。他们可绕过网站的身份认证和授权并访问整个 SQL 数据库的数据。他们也可利用 SQL 注入对数据进行增加、修…

SQL注入的一般过程

SQL注入的一般过程 概述SQL注入的步骤一道例题总结 概述 SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以…

细说——SQL注入

目录 SQL是什么?什么是SQL注入漏洞原理漏洞原因为什么会有SQL注入注⼊点可能存在的位置漏洞危害提交方法判断注入点判断字符型还是数字型sql注入绕过获取网站路径SQL 注入读写文件1. 数据库支持文件读写2. 当前用户具有文件权限3. 知道文件绝对路径 查询方式及报错盲…

什么是SQL注入

什么是sql注入? 既然你会来看这篇文章,说明你和写这篇文章时的我一样,是个安全小白。不管你是以何种原因想要了解“什么是sql注入”,我都希望这篇文章尽可能地会给你一点收获。 两个通俗的概念 SQL 注入就是指 web应用程序对用户…

SQL注入(一)—— sql手动注入实操

SQL SQL注入sql 注入的核心 SQL 手注的一般流程判断注入点 —— 第一步判断字段数 —— 第二步判断回显点 —— 第三步查询相关内容 —— 第四步判断库名判断表名判断列名查询具体信息 总结 SQL注入 SQL注入攻击是目前web应用网络攻击中最常见的手段之一,曾被冠以 “…

【SQL注入-01】SQL语句基础及SQL注入漏洞原理及分类

目录 1 SQL注入概述1.1 SQL注入简介1.2 SQL注入原理(掌握)1.3 SQL注入漏洞的危害(掌握) 2 SQL注入漏洞分类2.1 注入位置分类(掌握)2.2 注入数据类型分类(掌握)2.3 注入手法分类&…

SQL注入详解(全网最全,万字长文)

漏洞原因 一些概念: SQL:用于数据库中的标准数据查询语言。 web分为前端和后端,前端负责进行展示,后端负责处理来自前端的请求并提供前端展示的资源。 而数据库就是存储资源的地方。 而服务器获取数据的方法就是使用SQL语句进…

sql注入基础原理(超详细)

一、Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。 二、Web 程序三层架构 三层架构(3-tier architecture) 通常意义上就…

数据库存储过程语法

mysql 5.0存储过程学习总结 一.创建存储过程 1.基本语法: create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递…

存储过程语法--变量

目录 实例演示 定义默认值并使用 定义赋值再使用 定义2变量,通过查询表内数据进行赋值并使用 定义变量declare 变量名 数据类型 [default 默认值];变量赋值方式一set 变量名 变量值;变量赋值方式二select 列名 into 变量名 from 表名 [where 条件]; 实例演示 定义…

mysql 5.0存储过程(包括语法,符号)

一.创建存储过程 1.基本语法: create procedure sp_name() begin ……… end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法&a…

Oracle存储过程语法学习

Oracle存储过程: 1.1 第一个存储过程 --创建存储过程 create or replace procedure proc1( p_para1 varchar2, p_para2 out varchar2, p_para3 in out varchar2 )as v_name varchar2(20); begin v_name : 张三; p_para3 : v_name; …

sql存储过程语法详解

一、定义变量 使用关键字declare申明变量: declare 变量名 变量类型 /*简单赋值*/declare a intset a5print a/*select赋值*/declare b nvarchar(10) select b stu_name from dbo.student where stu_id6 print b/*update赋值*/declare c nvarchar(10) upd…

MySQL常用操作之创建存储过程语法详解

MySQL常用操作之创建存储过程语法详解 前言简介语法创建结构变量结构入参变量和出参变量流程控制判断(IF 语句)判断(CASE 语句)循环(LOOP 语句)循环(WHILE 语句)循环(REPEAT 语句)再次循环(ITERATE 语句) 总结参考链接 前言 场景介绍 作为一名Java搬运工,实际开发中…

Oracle 存储过程语法

Oracle 存储过程语法 1. 创建表(测试数据准备) -- 创建用户表 create table TT_USER (USERID NUMBER(10),USERNAME VARCHAR2(255),PASSWORD VARCHAR2(255),SEX VARCHAR2(1) );INSERT INTO TT_USER VALUES (101, zhang, 111, 1); INSERT INTO TT…

mysql存储过程基本语法

本文来说下mysql存储过程基本语法 文章目录 基本语法使用实例变量的使用变量定义declare语句变量赋值用户变量 存储过程的参数in 输入参数out 输出参数inout输入输出参数 本文小结 基本语法 存储过程就是具有名字的一段代码,用来完成一个特定的功能。创建的存储过程…

Oracle存储过程基本语法

后来者居上,不是easy的事情 尤其技术类work,更加如此。都是have one 投入的过程的。尤其开发,还是属于技术壁垒挺高的行业。 创建基本的存储过程 1 CREATE OR REPLACE PROCEDURE MyProName IS 2 BEGIN 3 NULL; 4 END; 行1:CREATE OR REPL…

存储过程常见语法

存储过程常见语法 一、存储过程的概念: 1、存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行 2、存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数…

存储过程的语法讲解

在上一篇文章:别再说不知道什么是存储过程和存储函数了 中简单的介绍了存储过程和存储函数以及其使用。其实存储过程是可以进行编程的,所以可以和其他的编程语言一样使用变量、表达式以及控制结构进行编程,从而实现一些复杂和有用的功能。这篇…

子网掩码的作用

IP地址由网络和主机两部分标识组成 IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。在局域网内相互间通信的网络必须具有相同网络地址,也叫相同的网段,在同一个网段内每个设备的主机…