这个 PDO 代码对 SQL 注入是不是足够安全? [复制]

Posted

技术标签:

【中文标题】这个 PDO 代码对 SQL 注入是不是足够安全? [复制]【英文标题】:Is this PDO code safe enough from SQL injection? [duplicate]这个 PDO 代码对 SQL 注入是否足够安全? [复制] 【发布时间】:2013-03-13 21:56:41 【问题描述】:

正如标题所说:这段代码对 SQL 注入是否足够安全?

有没有更好的方法来防止 SQL 注入?

<?php
$hostname   = "xxx";
$username   = "xxx";
$dbname     = "xxx";

$password   = "xxx";
$usertable  = "xxx";
$yourfield  = "xxx";

$db = new PDO('mysql:host='.$hostname.';dbname='.$dbname.'', $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$query = $db->prepare("INSERT INTO `$usertable` (first_name, last_name, username) VALUES (:first_name, :last_name, :username)");
$query->bindValue(':first_name', $_POST['first_name']);
$query->bindValue(':last_name',  $_POST['last_name']);
$query->bindValue(':username',   $_POST['username']);

$query->execute();
?>

【问题讨论】:

这个问题更适合Code Review SE。 Code Review 是一个问答网站,用于分享您正在从事的项目中的代码以供同行评审。 【参考方案1】:

如果您只使用上面代码中的准备语句,那么您是安全的。 AFIK 没有其他可能通过 SQL 注入攻击您的网站。

prepare 语句包含来自命令的数据,因此不能将 content 作为 SQL 语句的一部分执行。

【讨论】:

【参考方案2】:

是的,准备好的查询通常几乎 100% 不会受到 SQL 注入的影响。但是,我建议还将data_type 参数传递给PDO::bindParam()

见:Are Prepared Queries 100% Safe Against SQL Injections

【讨论】:

【参考方案3】:

Yes this PDO code safe enough from SQL injection.

【讨论】:

以上是关于这个 PDO 代码对 SQL 注入是不是足够安全? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我的 PDO 查询对 SQL 注入安全吗?

这种动态 SQL 查询生成对注入安全吗?

PDO防止sql注入的机制

在codeigniter中逃避足够的防止sql注入的保护

PDO(PHP Data Object),Mysqli,以及对sql注入等问题的解决

防止 SQL 注入 - PDO,mysqli [重复]