【网络安全 SQL注入】一文讲清预编译防御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>

## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**

![img](https://img-blog.csdnimg.cn/img_convert/66066612b6a7c47b570839d2e2d3a502.png)

![img](https://img-blog.csdnimg.cn/img_convert/8fd5dd41078bb035d566966c947761aa.png)

![img](https://img-blog.csdnimg.cn/img_convert/ddc72c9b2f8e5a32a4420b74b0969bb8.png)

![img](https://img-blog.csdnimg.cn/img_convert/936bb568d34501510dc81865d3d6147c.png)

![img](https://img-blog.csdnimg.cn/img_convert/6c27ddf3b76dee641e35e27d4e8ae0a8.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)

**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值