首页 > 代码库 > 预处理(防止sql注入的一种方式)

预处理(防止sql注入的一种方式)


<!--- 预处理(预编译) --->

<?php
/*
防止 sql 注入的两种方式:
1. 人为提高代码的逻辑性,使其变得更严谨,滴水不漏。 比如说 增加判断条件,增加输入过滤等,但是智者千虑必有一失。(不推荐)
2. sql 语句的预处理
*/

// 预处理: 就是在程序正式编译之前,事先处理,因为有些功能实现是一样的,只是发生了一些简单的值替换

/*
********** 预处理的原理: *********

insert into register_info values(?,?,?,?);

01. 创建 sql语句模板,并发送到数据库。预留的值使用参数 ? 标记
02. 数据库对模板解析,编译,对sql 语句模板执行查询优化,并存储结果不输出
03. 最多将绑定的参数传给之前 ? 标记的地方,模板执行语句。如果传的参数不一样,模板就可以多次使用。但是对模板的解析只需要做一次


********** 预处理的优点 ***********

01. 预处理语句大大减少了分析时间,只做了一次增删改查(至于值被多次赋予,已经不需要数据库来操作)
02. 绑定参数减少了服务器带宽,你只需要发送查询或者增加的参数,而不是整个 sql 语句
03. 预处理语句能很好的防止 sql注入,因为参数的发送不会影响一开始对模板的解析,编译,模版又是自己定义的,根本不会有漏洞

*/



// 面向对象

// 1. 连接数据库服务器,选择数据库 register
$mysqli = new mysqli(‘localhost‘,‘root‘,‘‘,‘register‘);

if ($mysqli){
echo ‘<h2><i>连接数据库成功</i></h2>‘;

// 2. 设置字符集
$mysqli->set_charset(‘utf8‘);

// 3. 预处理的核心代码(这部分代码数据库只执行一次)
// a. 写sql语句模板 (register_info是已有的表)
$sql = "insert into register_info(id,username,password,email,tel)VALUES (?,?,?,?,?)";

// b. prepare() 方法,预处理阶段
$stmt = $mysqli->prepare($sql);


/*------------- 以下代码都是重复执行的,都是由 $stmt 对象操作 --------------*/
// a. 绑定参数 bind_param()
// 给预留的 ? 赋值,要求类型和顺序要和 ? 所表示的一致
/*
格式占位符,格式列表:
i ---> int 整型
s ---> string 字符串
d ---> double 双精度浮点型
b ---> blob(binary large object) 二进制大对象
*/

$id = 2;
$username = ‘王二‘;
$password = ‘1237890‘;
$email = ‘wang@qq.com‘;
$tel = ‘12345678987‘;

$stmt->bind_param(‘issss‘,$id,$username,$password,$email,$tel);

// b. 开始插入
if ($stmt->execute()){
echo ‘<h2><i>插入成功</i></h2>‘;
}else{
echo ‘<h2><i>插入失败</i></h2>‘;
}

// 4. 关闭预处理
$stmt->close();

// 5. 关闭数据库
$mysqli->close();



}else{
die(‘连接数据库失败!‘);
}










预处理(防止sql注入的一种方式)