SQL注入之如何防御

SQL如何防御:

1.PHP MySQL 预处理语句----------解释来源菜鸟教程

简介:
预处理语句对于防止 MySQL 注入是非常有用的。
预处理语句及绑定参数
预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。

预处理语句的工作原理如下:

  1. 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:
    INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
  2. 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
  3. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句

例子:

<?php 
$servername = "localhost"; 
$username = "username"; 
$password = "password"; 
$dbname = "myDB"; 
// 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); 
// 检测连接
 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } 
// 预处理及绑定 
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"); 
$stmt->bind_param("sss", $firstname, $lastname, $email); 
// 设置参数并执行 $firstname = "John"; 
$lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); 
$firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); 
echo "新记录插入成功"; 
$stmt->close(); 
$conn->close(); 
?>

解释:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"

在 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。
接下来,让我们来看下 bind_param() 函数:

$stmt->bind_param("sss", $firstname, $lastname, $email);

该函数绑定了 SQL 的参数,且告诉数据库参数的值。 "sss" 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。

参数有以下四种类型:

● i - integer(整型)
● d - double(双精度浮点型)
● s - string(字符串)
● b - BLOB(binary large object:二进制大对象)
每个参数都需要指定类型。

通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。

2.使用函数过滤:
编写一个过滤接受字符串的函数:

<?php
function clean_input( $var)
{
    $var = addslashes(strtolower(trim($var)));
    return $var;
}
?>

解释:

trim() 函数移除字符串两侧的空白字符或其他预定义字符。
1.png

strtolowe()函数是将字符串转换为小写

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是:
● 单引号(')
● 双引号(")
● 反斜杠()
● NULL

使用方法:加在接受参数的地方:

$username=clean_input($_POST['username']);

标签: none

添加新评论