PDO准备好的陈述[关闭]

Posted

技术标签:

【中文标题】PDO准备好的陈述[关闭]【英文标题】:PDO prepared statements [closed] 【发布时间】:2013-06-09 04:43:58 【问题描述】:

我知道应该使用 PDO 准备语句来避免 SQL 注入。它必须始终采用这种格式:

$stmt = $db->prepare('SELECT * FROM table where id = :id');
$stmt->execute( array(':id' => $_GET['id']) );

或者以下任何一种格式也会否定 SQL 注入?

版本 1

$queryString = "SELECT * FROM table WHERE id = ".$_GET['id'];
$stmt= $db->prepare($queryString);  
$stmt->execute();
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);

第 2 版

$stmt = $db->query("SELECT * FROM table WHERE id = ".$_GET['id']);
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);

【问题讨论】:

通过在字符串中插入 id,您在某种程度上否定了像 PDO 那样添加参数的意义。这两个示例可能会起作用 - 您可以自己更轻松地进行测试 - 但第一个是唯一真正可以防止注入的示例 这段代码能用吗?你试过了吗? 绑定参数用于避免sql注入未准备好的语句 【参考方案1】:

您必须像在第一个代码中那样绑定变量。 Version 1Version 2 代码都是INSECURE

【讨论】:

以上是关于PDO准备好的陈述[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

什么是准备好的陈述?

我如何做出准备好的陈述?

我准备好的陈述有啥问题?

在 SQLite3 和 PHP 中使用准备好的语句

我需要坚持准备好的陈述吗?

第一个准备好的语句只执行[关闭]