根据经验,并且不断被告知使用准备好的语句和绑定我的参数的好处,我一直在我的代码中使用这两种技术,但是我想确切地了解这两种技术中的每一种的目的:
根据我对准备好的陈述的理解:
$sql = "SELECT * FROM myTable WHERE id = ".$id;
$stmt = $conn->prepare($sql);
$stmt->execute();
前面的代码应该使用我提出的查询在数据库中创建一种缓冲区。现在根据我的理解(我可能是非常错误的),前面的代码是不安全的,因为字符串$sql
可能是任何取决于$id
实际情况的字符串,如果$id
= 1; DROP TABLE myTable;--
,即使我有一个准备好的语句,我也会插入一个恶意查询。
据我了解,这是绑定我的参数的地方。如果我改为执行以下操作:
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id', $id);
$stmt->execute();
数据库应该事先准确地知道 sql 语句的所有部分:
SELECT
这些列:*
FROM myTable
和WHERE id =
“用户输入的变量”,如果是"a variable that was input by the user" != a variable
,则查询失败。
有些人告诉我我的理解是正确的,而其他人则告诉我这是错误的,如果我错了、正确或遗漏了什么,有人可以告诉我吗?并尽可能详细地说明,非常感谢所有反馈!