何时在 PHP Mysqli 中使用准备好的语句?- 用户表单搜索输入与选择查询

obc*_*tle 5 php mysqli prepared-statement

我试图了解何时应该在 php/mysqli 中使用准备好的语句。每个 php/mysqli 查询是否应该使用准备好的语句,还是仅使用涉及用户输入的查询和实例……例如要求用户输入数据以在数据库中进行搜索的 html 表单?

我正在将旧的 php5/mysql 代码迁移到 php7/mysqli。我有很多查询 mysql 数据库的 php 文件。如果我需要对连接到 mysql 数据库的每个 php 文件使用准备好的语句,我想澄清一下...例如通过“php require”引用的 php 文件,并包含简单的 sql select 语句来渲染图像和链接到 html页?

<?php

//establish connection

$con = new mysqli('localhost','uid','pw','db');

//check connection

if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);  
}

//search variable that stores user input

$search = "%{$_POST['search']}%";

//prepare, bind and fetch

$stmt = $con->prepare("SELECT image, caption FROM `tblimages`
WHERE catid = 3 AND caption LIKE ? order by caption ASC");
$stmt->bind_param("s", $search);
$stmt->execute();
$stmt->bind_result($image,$caption);

while ($stmt->fetch()) {
echo "{$image} <br> {$caption} <br>";    
}

$stmt->close();

//close database connection

mysqli_close($con);

?>
Run Code Online (Sandbox Code Playgroud)

上面的代码有效,并且是我第一次使用准备好的语句。它从表单中获取用户输入(用于输入搜索词的空白框 - POST)并搜索数据库...然后将结果呈现到 html 页面。这似乎是准备好的语句的逻辑用法。但是...我还有其他 php 文件,其中用户从表单中的下拉框中选择数据以呈现结果(用户不会像上面那样将数据输入到搜索框中)。我是否也为该实例使用准备好的语句?另外,我是否对通过“php require”引用的 php 文件使用准备好的语句,并包含简单的 sql select 语句来渲染图像和链接到 html 页面?我还没有找到使用准备好的语句来防止 SQL 注入的具体实例的说明。欢迎任何澄清或参考。

Dha*_*man 5

简短回答:始终使用准备好的语句。

长答案:

准备好的语句将数据与 SQL 命令分开。它们由PDOMySQLi提供。它们最大的优点是,如果你的数据被当作数据来处理,那么就不可能发生SQL注入。另一个优点是,您可以使用不同的数据集一遍又一遍地执行相同的查询,这可能会更好地提高性能,并且通常会使您的代码更干净。

但是,有时您希望根据用户的选择或操作进行某种动态查询。您可能知道表名和列名不是数据,而是 SQL 查询的一部分,因此您不能将它们分开。准备好的语句的替代方法是拥有一个可能值的白名单,并且只允许根据白名单验证用户输入。

您可能会问queryreal_querymulti_queryPDO::exec有何用处?
正如 PHP 手册所示,当您只需要执行不带任何变量的常量查询或当您有无法准备的查询时,它们有时会很有用。例如

$mysqli->query('SELECT Name FROM City LIMIT 10');
$pdo->exec('DELETE FROM fruit');
$mysqli->multi_query('DELETE FROM fruit; DELETE FROM pets;');
Run Code Online (Sandbox Code Playgroud)

如果您知道数据的类型和值怎么办?您还应该准备/绑定吗?
是的!养成将所有数据与 SQL 查询绑定的习惯。没有理由例外。在代码中跟踪这些异常要困难得多,并且始终确保不会用一些未知的输入覆盖“安全”值。

如果您仍然不确定如何使用准备好的语句,或者您认为它们太复杂(事实并非如此),您可以在https://phpdelusions.net上查看精彩的 PHP 教程