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

相关推荐

  • WAF防火墙的作用

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

    2026年6月5日
    0
  • DDoS分布式拒绝服务攻击种类

    网络新闻中总能频繁看到各类大型平台遭遇DDoS攻击的相关报道,这类攻击会直接造成网站宕机、页面瘫痪,用户无法正常浏览和使用平台内容。当下网络环境中,主流的DDoS攻击方式主要有以下…

    2026年5月27日
    0
  • 站点为什么要安装SSL证书?

    大数据时代互联网发展迅速,给我们的生活带来便利的同时,也伴随着很多网络钓鱼、信息泄露、网络诈骗等事件的频繁发生,互联网就像一张巨型的蜘蛛网,汇聚和扩散各种各样的信息,而网站在当中就…

    2026年4月25日
    0
  • 什么是AI算力集群?

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

    2026年6月29日
    0
  • 什么是 localhost,127.0.0.1 是如何工作的?

    我们平时访问网址,本质是和互联网上某台服务器通信;而 127.0.0.1 是特殊地址 —— 发往它的请求不会离开本机,会直接原路返回,这种机制叫回环(loopback),对应的域名…

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

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

    2026年5月18日
    0
  • 什么是数据库审计?

    防火墙主要负责阻挡外部安全威胁,而数据库审计则侧重于管控数据库内部的隐患。面对潜在的安全威胁,搭建一套行之有效的信息安全审计体系,强化对数据库的管控,有效治理并缩减信息安全风险,是…

    2026年6月5日
    0
  • IPv4 与 IPv6 是什么? 带你一次搞懂 IP 地址差异

    随着网络设备、云端服务与 IoT 应用快速成长,全球连接设备的数量早已远远超过当初设计网络时的预期,也让 IPv4 地址不足成为无法忽视的现实问题。 从电脑、手机、企业官网、App…

    2026年3月28日
    0
  • 域名赎回期究竟指的是什么?

    大家会发现,未及时续费的域名,过期一段时间后会进入赎回期,续费的价格会比正常续费贵上十几倍。所谓域名赎回,是指域名因未在常规续费期限内完成续费,被移入国际域名总库,国际域名总库会对…

    2026年6月15日
    0
  • Linux服务器空间满了,no space lef告警如何解决

    在Linux服务运维过程中,磁盘空间告警,一般都是比较常见的告警。如果磁盘满了,一般系统日志都会有no space left的告警。但是出现告警,有可能有好几种情况。 几种情况分析…

    2026年7月13日
    0