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

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

提问人:pjk_ok 提问时间:6/4/2021 最后编辑:pjk_ok 更新时间:6/4/2021 访问量:94

问:

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

此表单数据在进入数据库的过程中使用函数和正则表达式进行 santized 和验证,当任何这些数据输出到它使用 .filter_var()htmlspecialchars()

为了防止我正在使用的 SQL 注入,我使用了下面的代码。当我第一次学习 PDO 时,这是我在教程中看到的,我个人认为它非常容易阅读/理解。

我在 php.net 网站上注意到,在我最近看到的其他一些代码中,他们使用了bindparams(),而在下面的代码中,我总是在方法的数组中执行此操作。execute()

我的代码在下面安全吗?还是必须按照第二个代码示例中显示的方式使用 bindparams?

下面是一些使用来自 Web 表单的 firstname 输入的示例代码

<?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();

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

php 安全 pdo 准备语句 sql 注入

评论


答:

2赞 hobbs 6/4/2021 #1

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