$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
最终要有一个可以使用的对象,就像您使用
*
时一样。
对于您的第二种情况,我们正在谈论
帕拉卡式化。发生的是将传递给数据库的变量被逃脱和引用(除非您另外用第三个参数指定为也,为了使生活更轻松,您可以使用这样的准备陈述来进行隐式约束:
WHERE id =
甚至是这样,带有未命名的参数:
"a variable that was input by the user" != a variable
自然,当我输入答案时,在评论中已经解释了其中的大多数!