什么是SQL注入?SQL注入如何防范?

一、SQL注入

1、什么是SQL注入?

SQL注入属于较为常见的一种网络攻击手法,主要攻击目标锁定在数据库上,针对程序员在编写代码时出现的疏漏,借助SQL语句,达成无需账号即可登录、篡改数据库内容的目的。

简单来说,SQL注入就是通过在表单当中填入包含SQL关键字的数据,从而让数据库执行非常规代码的过程。

SQL数据库的各项操作都是借助SQL语句来执行的,这就导致一旦我们在代码里混入了某些SQL关键字(比如DELETE、DROP等),这些关键字就极有可能在数据库进行写入或读取数据时被一并执行。

2、SQL注入攻击的整体思路

寻找SQL注入可能存在的位置;

判断服务器类型以及后台数据库的类型;

针对不同服务器与数据库各自的特性展开SQL注入攻击。

3、SQL注入案例演示

来看一个SQL注入的实际案例。

正常代码

import sqlite3 
# 连接数据库 
conn = sqlite3.connect('test.db') 
# 建立新的数据表 
conn.executescript('''
DROP TABLE IF EXISTS students;        
CREATE TABLE students
        (id INTEGER PRIMARY KEY AUTOINCREMENT,
         name TEXT NOT NULL);'''
# 插入学生信息 
students = ['Paul','Tom','Tracy','Lily'] for name in students:     
query = "INSERT INTO students (name) VALUES ('%s')" % (name)     
conn.executescript(query); 
# 检视已有的学生信息 
cursor = conn.execute("SELECT id, name from students") 
print('IDName') for row in cursor:     
print('{0}{1}'.format(row[0], row[1])) 
conn.close()

SQL注入代码

# 连接数据库 
conn = sqlite3.connect('test.db') 
# 插入包含注入代码的信息 
name = "Robert');
DROP TABLE students;
--" query = "INSERT INTO students (name) VALUES ('%s')" % (name) conn.executescript(query) 
# 检视已有的学生信息 
cursor = conn.execute("SELECT id, name from students") 
print('IDName') for row in cursor:     
print('{0}{1}'.format(row[0], row[1]))     
conn.close()

上述代码一旦执行,其造成的后果可想而知。

二、怎样防范SQL注入

凡是存在SQL注入漏洞的程序,都是因为程序需要接收来自客户端用户输入的变量,或是URL传递过来的参数,而这个变量或参数又恰恰是构成SQL语句的一部分,对于用户输入的内容或传递而来的参数,我们理应时刻保持警觉,这正是安全领域中”外部数据不可轻信”这一原则的体现。

纵观Web安全领域中的各类攻击手段,大多数都是由于开发者违背了这一原则所导致的,因此自然而然能想到的应对方式,便是从变量的检测、过滤、验证这几个环节着手,确保变量符合开发者原本的预期。

1、核查变量的数据类型与格式

如果SQL语句是类似where id={$id}这样的形式,而数据库中所有的id均为数字类型,那么就应当在SQL语句被执行之前,核实确保变量id属于int类型;倘若是其他类型,比如日期、时间等,道理也是相通的。只要是具备固定格式的变量,在SQL语句执行前,都应当严格依照固定格式进行核查,确保变量符合我们的预期格式,这样在很大程度上便能规避SQL注入攻击的发生。

2、过滤特殊符号

对于无法确定固定格式的变量,务必要进行特殊符号的过滤或转义处理。

3、绑定变量,采用预编译语句

事实上,绑定变量并采用预编译语句是预防SQL注入最为理想的方式,采用预编译的SQL语句其语义不会发生变化,在SQL语句当中,变量以问号?来表示,黑客即便本领再高强,也无法更改SQL语句原本的结构。

为何SQL预编译能够有效防御SQL注入

1、什么是预编译语句?

一条SQL语句从数据库接收到最终执行完毕并返回结果,可以划分为以下三个阶段:

词法与语义解析;

对SQL语句进行优化,制定相应的执行计划;

执行语句并返回结果。

许多情况下,同一类型的SQL语句可能会被反复执行,倘若每次都要经历上述的词法语义解析、语句优化、制定执行计划等流程,不仅会影响执行效率,也存在安全隐患。

所谓预编译语句,就是将这类语句当中的具体数值用占位符加以替代,可以将其理解为把SQL语句模板化或者说参数化处理,通常将这类语句称为Prepared Statements。

预编译语句的优势可以归纳为:一次编译、多次运行,省去了反复解析优化等环节;此外预编译语句还能够有效防止SQL注入的发生。

2、为何Statement容易遭受SQL注入?

Statement之所以容易遭受SQL注入,是因为SQL语句的结构发生了变化。

比如:

"select * from tablename where username='"+uesrname+ "'and password='"+password+"'"

在用户输入’or true or’之后SQL语句结构便发生了改变。

select * from tablename where username='' or true or '' and password=''

这样一来,原本应当是判断用户名与密码同时匹配才算通过,但经过改动之后变成了”或”的逻辑关系,无论用户名和密码是否匹配,该表达式的返回值永远都是true;

3、为何Preparement能够防止SQL注入?

其原理在于采用了预编译的方式,先将SQL语句中可被客户端所控制的参数集合进行编译处理,生成相应的临时变量集合,再借助对应的设置方法,为临时变量集合当中的元素赋值,赋值函数setString()会对传入的参数实施强制类型检查以及安全检查,因此便避免了SQL注入现象的产生。

Preparement的样式如下:

select*from tablename where username=? and password=?

该SQL语句会在获取用户输入之前先在数据库中完成预编译处理,这样一来无论用户输入怎样的用户名和密码,其判断逻辑始终都是”并”的关系,从而有效防止了SQL注入的发生。

原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/3130.html

Like (0)
Previous 2026年7月10日
Next 2026年7月10日

相关推荐

  • 【余初云】云等保等级安全建设

    云计算等级保护是整个等保2.0的组成部分,它与等级保护的”通用”部分构成一个整体,来规范云计算的等级保护建设,为云计算平台网络安全建设设定基线。一方面做好物…

    2026年6月18日
    0
  • cpu核数是什么意思

    CPU是什么意思?CPU是日常生活中很常见的硬件设备,台式电脑、笔记本电脑、手机、服务器中都必须要有CPU,CPU核数即一个CPU由多少个核心组成,核心数越多,代表这个CPU的运转…

    2026年5月22日
    0
  • 拒绝服务攻击 DoS 与 DDoS 解析

    在网络安全领域,DoS 和 DDoS 是两类高频且危害显著的攻击方式,二者核心目的都是让目标网络或服务器无法正常提供服务,但攻击模式、破坏力和应对难度截然不同。 DoS,即拒绝服务…

    2026年5月18日
    0
  • 什么是远程代码执行(RCE)攻击?

    远程代码执行(RCE)攻击指的是借助系统某一层级存在的安全缺陷,向目标系统中植入并运行恶意指令。攻击者借此可在受害系统上执行各类操作——包括下达系统命令、窃取敏感信息、篡改或加密数…

    2026年6月23日
    0
  • 什么是会话固定攻击(Session Fixation)?

    你知道吗?登录网站时,网站是怎么记住你身份的?答案就是会话(Session)。 可以把 Session 想象成住酒店拿到的房卡。拿着这张卡,酒店就知道你是哪个房间的客人,能进出房间…

    2026年5月18日
    0
  • 如何在 Linux 服务器上使用 Dokploy 实现项目快速部署

    很多开发者写完应用后都会面临同一个问题:如何把本地代码稳定地上线到服务器。配置 Web 服务器、环境变量、SSL 证书、Docker、CI/CD 等一系列操作,对新手来说既繁琐又容…

    2026年4月21日
    0
  • 高防CDN如何为网站提供防护?

    市面上各类高防产品接连涌现,由此可见防御能力对网站运营而言具有举足轻重的意义,如何挑选合适的防御产品也随之成为大众热议的焦点,高防CDN究竟是利器还是摆设?答案由你评判。你真正了解…

    2026年7月24日
    0
  • 60个你必须知道的Linux命令:新手10分钟速通指南

    刚开始接触Linux的时候,很多人有一个共同的感受: “看别人操作都行云流水,自己一进终端就发懵。” 不是你笨,也不是Linux故意为难你——只是你可能还没捋清楚,那些最常用的命令…

    2026年4月10日
    0
  • 如何检查RAID阵列运行状态

    检查RAID阵列运行状态需要区分软件RAID和硬件RAID两类场景,不同场景对应不同的专属检查方法,以下是具体操作步骤: 一、软件RAID(mdadm管理)检查方法 ‌查看实时运行…

    2026年8月6日
    0
  • 什么是AI算力集群?

    近些年,AI浪潮席卷全球,成为全社会瞩目的焦点话题。 每当人们谈起人工智能,AI算力集群这个关键词就会频繁出现。AI有三大核心要素,分别是算力、算法与数据,而AI算力集群,恰恰是当…

    2026年6月29日
    0