理解PDO准备的语句和绑定参数

问题描述 投票:0回答:1

$sql = "SELECT * FROM myTable WHERE id = ".$id; $stmt = $conn->prepare($sql); $stmt->execute();

先前的代码应使用我提出的查询来创建数据库中的一种缓冲区。现在

从我的理解
(我可能是非常错误的),以前的代码是不安全的,因为字符串可以取决于实际是什么,如果我有一个准备好的语句,我也会插入恶意查询。 

从我的理解中这是绑定我的参数com的位置。如果我做以下操作:

$sql
数据库应在手上完全了解SQL语句的所有部分:
$id
这些列:
$id

1; DROP TABLE myTable;--

$sql = "SELECT * FROM myTable WHERE id = :id"; $stmt = $conn->prepare($sql); $stmt->bindParam(':id', $id); $stmt->execute(); “用户输入的变量”,如果查询失败。 我被某些人告诉我,我的理解是正确的,而其他人则是错误的,有人可以让我知道我是否错了,纠正或错过了什么?并尽可能地详细说明所有反馈都非常感谢!

    

您的理解是正确的;准备好的语句和临时语句之间存在差异。 执行前的语句的审计

并不能固有地安全。如果您使用变量数据,通常可以完成,但是如果您重复执行相同的查询,即使没有任何变量,也可能有助于减少开销。如果您要执行普通语句
没有变量
,则可以简单地执行:
SELECT
最终要有一个可以使用的对象,就像您使用
*

时一样。

对于您的第二种情况,我们正在谈论

帕拉卡式化。发生的是将传递给数据库的变量被逃脱和引用(除非您另外用第三个参数指定为
php mysql pdo prepare bindparam
1个回答
10
投票
,它将其作为字符串发送,在大多数情况下是很好的。)因此,如果发送不良数据,查询将不会“失败”。它的行为就像您传递的有效数字一样,该数字在数据库中不存在。当然,有些边缘案件即使有正确准备的陈述,您仍然很脆弱。

也,为了使生活更轻松,您可以使用这样的准备陈述来进行隐式约束:

WHERE id = 甚至是这样,带有未命名的参数: "a variable that was input by the user" != a variable 自然,当我输入答案时,在评论中已经解释了其中的大多数!

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.