如果我在执行函数中绑定参数,我的 PDO 准备语句是否安全?

Is My PDO Prepared Statement Secure If I Bind The Parameters In The Execute Function?

我有一些表单数据正在使用 PDO 准备好的语句写入数据库。

此表单数据在进入数据库的途中使用 filter_var() 函数和正则表达式进行清理和验证,当任何此数据输出到站点时,它会使用 htmlspecialchars() 进行转义.

为了防止 SQL 注入,我使用了下面的代码。当我第一次学习 PDO 时,这是我在教程中看到的,我个人觉得它很容易 read/understand。

我注意到 php.net 网站和我最近看到的一些其他代码使用了 bindparams(),而在下面的代码中,我总是在 execute()方法。

我下面的代码安全吗?或者我必须按照第二个代码示例中所示的方式使用 bindparams 吗?

下面是一些使用来自网络表单的名字输入的示例代码

<?php

$firstname = $_POST['firstname'];

$firstname = filter_var($fname, FILTER_SANITIZE_STRING);

if(empty(trim($fname))){
    $error[] = "First Name cannot be blank";
}

$sql = "INSERT INTO users (firstname) VALUES (:firstname)";
$stmt = $connection->prepare($sql);
$stmt->execute([
    ':firstname' => $firstname,
]);

在 php.net 文档中,它使用 bindParam() 执行上述准备语句,如果您要更新多个字段,这似乎有点冗长?

<?php
$sql = "INSERT INTO users (firstname) VALUES (:firstname)";

$stmt = $connection->prepare($sql);
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);

$stmt->execute();

如果它更安全,那么我显然必须采用第二种方式,但想检查第一个代码块中给出的准备好的语句是否安全?

无论哪种方式都很好。安全优势完全来自于使用占位符。在某些情况下(动态构造的查询),将 bindParamexecute 调用分开使用是有益的,而在其他情况下,您希望避免冗长。使用适合你的。