如果我在执行函数中绑定参数,我的 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();
如果它更安全,那么我显然必须采用第二种方式,但想检查第一个代码块中给出的准备好的语句是否安全?
无论哪种方式都很好。安全优势完全来自于使用占位符。在某些情况下(动态构造的查询),将 bindParam
与 execute
调用分开使用是有益的,而在其他情况下,您希望避免冗长。使用适合你的。
我有一些表单数据正在使用 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();
如果它更安全,那么我显然必须采用第二种方式,但想检查第一个代码块中给出的准备好的语句是否安全?
无论哪种方式都很好。安全优势完全来自于使用占位符。在某些情况下(动态构造的查询),将 bindParam
与 execute
调用分开使用是有益的,而在其他情况下,您希望避免冗长。使用适合你的。