什么是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日

相关推荐

  • AESA自定义WAF规则库:行业级精准恶意攻击拦截的技术实现与落地指南

    在Web安全架构的演进过程中,通用WAF的标准化防护模式始终无法解决垂直行业的专属攻击防护痛点:电商的批量资损薅取、政企的敏感接口枚举、游戏的协议伪造刷量,这类攻击完全规避公开攻击…

    2026年8月26日
    0
  • sql注入攻击是什么意思?有何防护措施?

    SQL注入就是用恶意SQL语句攻击数据驱动的应用程序,通常目的是获取敏感数据。 什么是SQL注入? 结构化查询语言(Structured Query Language,SQL)注入…

    2026年4月27日
    0
  • 服务器安全加固是什么意思?

    网络环境中的各类服务器,诸如WEB服务器、FTP服务器、E-mail服务器等,历来都是黑客重点觊觎的攻击对象,其安全防护水平直接关系重大。尽管借助路由器的包过滤机制以及防火墙的访问…

    2026年7月27日
    0
  • WAF防火墙的作用

    随着WEB应用的广泛普及,WEB服务器凭借其强大的运算能力、处理性能以及所承载的较高价值,逐步成为主要的攻击目标。SQL注入、页面篡改、网页挂马等安全事件屡见不鲜。传统防火墙难以对…

    2026年6月5日
    0
  • 什么是等保?企业为什么要做等保测评

    什么是等保 等保,全称为网络安全等级保护,是我国网络安全领域当中的一项基础性制度安排。 等保的核心目的,在于依据网络信息及其信息承载体各自的重要程度进行相应的等级划分,并基于所划定…

    2026年7月15日
    0
  • 什么是DNS欺骗

    一、核心定义与别名 ‌基础定义‌:攻击者冒充域名服务器,把用户查询的目标网站IP替换为攻击者控制的恶意IP,让用户直接访问伪造站点。 ‌常见别名‌:也被称为DNS缓存投毒、域名服务…

    2026年8月11日
    0
  • 云主机快照有什么作用?

    伴随用户业务的推进,云主机磁盘数据持续发生变化,用户期望对某些关键时刻的数据进行备份,方便后续磁盘数据发生异常时,能够回退到备份时的状态,此时我们便可以借助云主机快照功能,实现数据…

    2026年6月13日
    0
  • Web攻击:详解SQL注入、XSS等九种注入攻击

    注入攻击属于众多攻击方式当中的一种,在这类攻击中,攻击者会向程序输入恶意的数据内容,解析引擎则会将这些恶意输入当作命令或查询语句的一部分加以处理,进而在无形中改变了程序原本的执行流…

    2026年7月10日
    0
  • 0day漏洞是什么意思?

    为了操作便捷、桌面整洁美观,多数用户都会选用无线鼠标替换传统有线鼠标。但当前市面上部分无线鼠标设备与电脑的传输通信未做加密处理,这一安全缺陷给网络黑客留下了可乘之机,存在不小的网络…

    2026年6月1日
    0
  • 服务器集群究竟是什么?

    如今“集群”这个概念正被越来越多人熟知,这项技术也早已渗透到各类实际业务场景中落地应用。不少人会好奇,服务器集群究竟是什么?它又具备哪些优势与短板? 一、什么服务器集群 服务器作为…

    2026年6月29日
    0