在 PHP 中防止 SQL 注入的 3 种智能方法

介绍

忽略 SQL 注入缓解技能可能是灾难性的,尤其是对于最近被科技公司聘用的初级开发人员。相信我,你不想在第一份工作中陷入这种糟糕的境地。

这就是为什么拥有防止 SQL 注入攻击的技能至关重要的原因。本指南将引导您了解三种不同的策略来保护您的 PHP 项目免受 SQL 攻击。

如果您准备好了,让我们深入了解本教程的核心…

什么是 SQL 注入

SQL 注入是一种网络安全漏洞,允许攻击者干扰应用程序对其数据库的查询。

此外,它可能是一种攻击动态 SQL 语句以注释掉语句的某些部分或附加始终为真的条件的攻击。它利用设计不佳的 Web 应用程序中的设计缺陷来利用 SQL 语句来执行恶意 SQL 代码。

SQL 注入的工作原理

SQL 注入攻击针对动态 SQL 语句中的漏洞。将动态 SQL 语句想象成数学中的多元函数,其中参数是固定的,而自变量中代入的值决定结果。

SQL 注入是通过使用激发所需响应的结构化查询来执行的。响应对于攻击者了解数据库架构和访问应用程序的安全信息至关重要。

SQL 注入示例

希望执行 SQL 注入的攻击者操纵标准 SQL 查询以利用数据库中未经验证的输入漏洞。执行此攻击向量的方式有很多种,这里将展示其中的几种方式,让您大致了解 SQLI 的工作原理。

例如,上面提到的提取特定产品信息的输入可以更改为http://www.estore.com/items/items.asp?itemid=999或 1=1。

结果,对应的 SQL 查询如下所示:

SELECT ItemName, ItemDescription
FROM Items
WHERE ItemNumber = 999 OR 1=1

并且由于语句 1 = 1 始终为真,因此查询会返回数据库中的所有产品名称和描述,即使是您可能没有资格访问的那些。

攻击者还能够利用错误过滤的字符来更改 SQL 命令,包括使用分号分隔两个字段。

例如,此输入http://www.estore.com/items/iteams.asp?itemid=999; DROP TABLE Users将生成以下 SQL 查询:

SELECT ItemName, ItemDescription
FROM Items
WHERE ItemNumber = 999; DROP TABLE USERS

结果,可以删除整个用户数据库。

可以操作 SQL 查询的另一种方法是使用 UNION SELECT 语句。这结合了两个不相关的 SELECT 查询来从不同的数据库表中检索数据。例如,输入http://www.estore.com/items/items.asp?itemid=999 UNION SELECT username, password FROM USERS产生以下 SQL 查询:

SELECT ItemName, ItemDescription
FROM Items
WHERE ItemID = '999' UNION SELECT Username, Password FROM Users;

使用 UNION SELECT 语句,该查询将项目 999 的名称和描述的请求与另一个提取数据库中每个用户的名称和密码的请求结合起来。

如何通过示例遏制 SQL 注入

Pexels 的 Tima Miroshnichenko 拍摄的照片:https://www.pexels.com/photo/man-and-woman-hacking-a-computer-system-5380655/

以下示例说明了如何在您的下一个 PHP 项目中防止 SQL 注入。

示例 #1:使用PDO(适用于任何受支持的数据库驱动程序)

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);

foreach ($stmt as $row) {
    // Do something with $row
}

示例 #2:使用MySQLi(用于 MySQL)

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // Do something with $row
}

示例 #3:使用自定义方法

$safe_variable = mysqli_real_escape_string($_POST["user-input"], $dbConnection);
mysqli_query($dbConnection, "INSERT INTO table (column) VALUES ('" . $safe_variable . "')");

至此,三个出色的示例可帮助您防止 PHP 中的 SQL 注入。

结论

我们已经得出了本教程的结论,希望您获得了很多价值。

了解如何防止 SQL 注入攻击是您作为开发人员应具备的一项重要技能。技术领域是激烈的,攻击者不会三思而后行危及您的系统,因此您必须一路提防。

如果您需要有关 PHP 项目的帮助,请随时通过我的网站咨询我。

直到下一次,享受!