准备好的语句如何在代码级别实现以及哪个实体实现它们?

How are prepared statements implemented at code level and which entitity implements them?

假设我们有一个典型的预处理语句查询,如下所示:

$db->query("SELECT * FROM users WHERE id = :id");
$db->bind(':id', "x ' OR 'x' = 'x");
$db->execute();

问题

确保避免 SQL 注入的幕后工作机制是什么?

也就是说,我知道 SQL 和数据必须在某个时候合并回来,数据检索过程才能工作。此次合并的机制是什么,由哪个子系统负责合并?

程序和数据分离

我听说 ProgramData 之间的内在分离消除了这种注入的可能性。这对我来说不是问题,因为我可以编写一个程序来简单地将 SQL 和数据重新组合在一起。

为了说明这一点,这里有一些代码来说明这一点。

//receive SQL statement and data *separately*
function setSQL($sql) {$this->sql = $sql;}

function setData($data) {$this->data = $data;}

function executeStatement()
{
    //simplified code that shows that we can 
    //blindly replace named parameter with supplied 
    //data inside SQL and execute it
    db_execute(str_replace(':id', $this->data, $this->sql));
}

我们受到保护了吗?那么,我们有一个程序吗?是的。我们有单独发送的数据吗?是的...我们还有注入攻击吗?是的....?我错过了什么?我缺少的部分是问题的核心。

数据必须以某种方式与 SQL 或程序结合,我试图找出它是如何在 code/pseudocode 级别完成的,以及哪个子系统负责将这些数据合并在一起。

我正在寻找 "Fill in this gap in my knowledge" 类型的答案,其中连接数据的机制足以弥补这一差距。

您需要了解的是代码和数据之间的区别。

代码是你写的程序,数据是这个程序使用的数据。他们从不干涉。

想象一个典型的 PHP 脚本,例如

echo "Hello ". $name;

无论$name 包含什么内容,这些内容都不会改变您的程序。它将永远保持不变。即使 $name 包含类似

的内容
<?php unlink(__FILE__);

不会有什么坏处。因为它只是不被解释为程序的数据。所以这段代码将简单地回显到浏览器,并且可以在源代码中看到。

与 [native] 准备好的语句完全相同

您有一个程序(SQL 查询)并且您有一些数据。后者仅被程序使用,但永远不能改变它。