【网络安全 | SQL注入】一文讲清预编译防御SQL注入原理

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 【网络安全 | SQL注入】一文讲清预编译防御SQL注入原理

在防止SQL注入的方法中,预编译是十分有效的,它在很大程度上解决了SQL注入问题。

SQL注入简析

数据库查询语句未对SQL注入做任何防护时,语句基本如下:

$name=$_POST['name'];  
$pass=$_POST['pass']; 
$sql="SELECT * FROM user WHERE name='$name' AND pass='$pass'";

当我们提交name=-1' union select 1,user()# pass=12时,后端查询语句变为:

$sql="SELECT * FROM user WHERE name='-1' union select 1,user()#' AND pass='12'";

等价于

$sql="SELECT * FROM user WHERE name='-1' union select 1,user()

由于数据库中没有id='-1’的数据项,此半句运行结果为FALSE,页面不会显示任何内容;后半句union select 1, 2, user(),表示联合查询当前的用户名,此半句运行结果为True,此时页面显示当前登录数据库的用户名(此为敏感信息)

也就是说,这导致了SQL的语法结构被更改,从而实现了命令执行:

而预编译能防止SQL语法结构被更改,它是怎么实现的呢?

在此之前,我们需要了解什么是预编译。

预编译

预编译又称为预处理,顾名思义,就是为代码编译做的预备工作。预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

举个例子,很多情况下,一条SQL语句可能会反复执行,或者每次执行的时候只有个别的参数值不同,如:

SELECT username, password FROM users WHERE id=121;
SELECT username, password FROM users WHERE id=1532;
SELECT username, password FROM users WHERE id=1123;
SELECT username, password FROM users WHERE id=121;
SELECT username, password FROM users WHERE id=121;
...

这些语句的语法树相同,但每次都要进行重复的编译,导致数据库运行效率低下。

预编译语句将以上语句中的值用占位符?替代,即将SQL语句模板化或者参数化,SQL语句先交由数据库预处理,构建语法树,再传入真正的字段值多次执行,省却了重复解析和优化相同语法树的时间,提升了SQL执行的效率。

简要来说就是:一次编译多次运行

预编译如何防止SQL注入

那么这和预防SQL注入有何联系?

在预编译的机制下,用户在向原有SQL语句传入值之前,原有SQL语句的语法树就已经构建完成,因此无论用户输入什么样的内容,都无法再更改语法树的结构。至此,任何输入的内容都只会被当做值来看待,不会再出现非预期的查询,这便是预编译能够防御SQL注入的根本原因。

预编译代码如下:

$name = $_POST['name'];
$pass = $_POST['pass'];
$stmt = $conn->prepare("SELECT * FROM user WHERE name=? AND pass=?");// 准备 SQL 查询语句,用于验证用户名和密码
$stmt->bind_param("ss", $name, $pass);// 绑定参数,防止 SQL 注入攻击
$stmt->execute();// 执行查询
$result = $stmt->get_result();// 获取查询结果集
if ($result->num_rows > 0) {
    // 用户验证成功

当我们提交name=1' union select 1,user()# pass=12时,由于预编译的存在,后端查询语句变为:

SELECT * FROM user WHERE name='1' union select 1,user()#' AND pass='12'

由于输入的内容都只会被当做值来看待,所以并不会导致恶意查询。

读者可以将sqli-labs的第一关(Less-1)的index.php修改为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-1 **Error Based- String**</title>
</head>
<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome <font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">
<?php
//including the Mysql connect parameters.
$sql_server = "localhost";
$sql_username = "root";
$sql_password = "root";
$sql_database = "security";
$mysqli = new mysqli($sql_server, $sql_username, $sql_password, $sql_database);
error_reporting(0);
// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
$sql="SELECT * FROM security.users WHERE id= ? LIMIT 0,1";
$mysqli_stmt = $mysqli->prepare($sql); //创建预处理对象
$mysqli_stmt->bind_param('i',$id); //绑定参数
$mysqli_stmt->bind_result($id,$username,$password); //绑定结果集
$mysqli_stmt->execute(); //执行
while($mysqli_stmt->fetch())
{
echo "<font size='5' color= '#99FF00'>";
echo 'Your Login name:' . $username;
echo "<br>";
echo 'Your Password:' . $password;
echo "</font>";
}
}
else { echo "Please input the ID as parameter with numeric value";}
?>
</font> </div></br></br></br><center>
<img src="../images/Less-1.jpg" /></center>
</body>
</html>

尝试注入,可以发现并不能成功。

然而,预编译语句并不适用于所有参数。在某些特定的场景下,如动态表名、动态列名或排序方式等,无法使用占位符进行替代,因为它们不属于参数值。一种常见的做法是执行输入验证和过滤,确保用户提供的数据符合预期的格式和规范。例如,可以使用白名单机制来限制可接受的表名和列名,或者通过预定义的选项来控制排序方式。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
存储 安全 网络安全
网络安全与信息安全:防御前线的科学与策略
【4月更文挑战第10天】 在数字化时代,数据成为了新的货币,信息流成了掌控权的象征。然而,随着信息技术的迅猛发展,网络安全漏洞、加密技术以及用户的安全意识构成了维护网络空间安全的三大支柱。本文将深入探讨网络安全中存在的风险点,分析加密技术的演进及其在保护数据完整性、机密性方面的重要性,并强调提升个人和组织的安全意识的必要性。通过科学的分析与策略的制定,我们旨在为读者提供一幅全面的网络安全蓝图,以应对日益繁复的网络威胁。
|
7天前
|
SQL 安全 算法
网络防御前线:洞悉漏洞、加固加密与提升安全意识
【4月更文挑战第8天】在数字化时代,网络安全与信息安全已成为维系信息社会正常运转的关键。本文从网络安全的漏洞发现、加密技术的应用以及提高个人和组织的安全意识三个维度出发,深入探讨了如何构建更为坚固的网络防御体系。通过对现有网络安全威胁的分析,我们揭示了漏洞挖掘的重要性,并介绍了当前流行的加密技术及其在保护数据完整性和隐私中的作用。同时,文章还强调了培养良好的安全习惯对预防潜在攻击的重要性。本文旨在为读者提供全面的网络安全知识框架,以便更好地应对日益复杂的网络威胁环境。
|
8天前
|
安全 算法 网络安全
网络防御的三重奏:漏洞管理、加密技术与安全意识
【4月更文挑战第7天】在数字化时代,网络安全和信息安全已成为企业和个人不可忽视的战场。本文将深入探讨网络安全的核心问题——漏洞管理,介绍现代加密技术的进展,并强调提升安全意识的重要性。通过分析网络攻击的常见手段,我们揭示了有效管理漏洞的策略;同时,评估了从对称加密到非对称加密,再到量子加密的技术演进。最后,文章指出,在技术和工具不断进步的同时,用户的安全意识仍是防御体系中不可或缺的一环。
|
12天前
|
SQL 安全 算法
网络安全与信息安全:防御前线的关键技术与意识
【4月更文挑战第3天】在数字化时代,网络安全与信息安全已成为维护信息完整性、确保数据私密性和保障系统可用性的基石。本文深入探讨了网络安全漏洞的概念、加密技术的应用以及提升安全意识的重要性,旨在为读者提供全面的网络安全知识框架,以应对日益复杂的网络威胁。
|
14天前
|
存储 安全 网络安全
云端防御战线:云计算环境下的网络安全与信息保护
在信息技术迅猛发展的今天,云计算作为支撑数字转型的重要基石,其安全性牵动着企业生存与发展的命脉。本文深入探讨了云计算环境中面临的安全威胁和挑战,并提出了一系列创新的安全策略和技术解决方案。通过综合分析公有云、私有云以及混合云服务模型中的安全需求,文章构建了一个多层次、全方位的网络安全防护体系。此外,针对数据加密、身份验证、访问控制等关键技术进行了深入剖析,旨在为读者提供一套系统的信息安全保护指南,确保在享受云计算带来的便利时,数据和资源的安全性不被妥协。
29 8
|
16天前
|
机器学习/深度学习 存储 算法
神经网络分类算法原理详解
神经网络分类算法原理详解
27 0
|
22天前
|
存储 安全 网络安全
云端防御策略:融合云服务与网络安全的未来之路
在数字化浪潮的推动下,企业纷纷转向云计算以获取灵活性、可扩展性和成本效益。然而,随之而来的是日益复杂的网络威胁,它们挑战着传统的安全边界。本文将探讨如何通过创新的云服务模型和先进的网络安全措施来构建一个既可靠又灵活的安全框架。我们将分析云计算环境中的关键安全挑战,并提出一系列针对性的策略来加强数据保护,确保业务连续性,并满足合规要求。
25 2
|
8天前
|
运维 Kubernetes Cloud Native
探索Kubernetes的大二层网络:原理、优势与挑战🚀
在云原生领域,Kubernetes (K8s) 已经成为容器编排的事实标准☁️📦。为了支撑其灵活的服务发现和负载均衡🔍🔄,K8s采用了大二层网络的设计理念🕸️。本文将深入探讨大二层网络的工作原理、带来的好处✨,以及面临的挑战和解决方案❗🛠️。
探索Kubernetes的大二层网络:原理、优势与挑战🚀
|
1天前
|
存储 人工智能 安全
网络安全与信息安全:防御前线的构筑与维护
【4月更文挑战第14天】在数字化时代,网络安全与信息安全已成为个人和企业不可忽视的重要议题。本文将深入探讨网络安全漏洞的概念、加密技术的进展以及提升安全意识的必要性。通过对网络攻击手段的分析,我们揭示了安全漏洞的本质及其对信息系统的潜在威胁。继而,文中细述了从古典到现代的加密技术,强调了它们在保护数据传输和存储中的核心地位。此外,文章还讨论了培养安全意识的有效途径,包括教育培训、模拟演练和安全政策的制定。通过全方位的分析和建议,旨在为读者提供一个关于如何构筑和维护网络安全防线的清晰蓝图。
|
3天前
|
安全 网络协议 网络安全
网络原理(5)--HTTPS是如何进行加密的
网络原理(5)--HTTPS是如何进行加密的
5 0