2

就像我的标题一样,我想知道如何在不使用 MySQLi 或 PDO 的情况下创建准备好的语句。重点是学习创造的过程和它的安全性。我在这方面几乎有“零知识”。尝试用谷歌搜索这个话题,但似乎我的谷歌搜索技能让我失望了。我从某些网站上盲目地了解到准备好的声明非常安全,但我看不出它安全的实际意义。你们中的一些人可以澄清为什么会这样吗?那将是一个很大的帮助。我有自己的假设,即创建一个准备好的语句只是创建一个接收字符串并用 str_replace 替换所有特殊字符的函数,例如:

$org_sql = 'SELECT * FROM `my_table` WHERE `table_id`=?';
$prepared_sql = replaceQueryString($org_sql, 10);

function replaceQueryString($str, $replace) {
    // Do the replace where ? will be replaced by $replace here.
    return $str;
}

但我想知道这是否会提高安全级别,这对我来说看起来很简单。

如果您不想浪费时间回答这个问题,只需向我指出资源可用的地方。所以总结一下。

  1. 如何创建 MySQL 准备好的语句?
  2. 为什么它是安全的?

非常感谢。

4

2 回答 2

5

准备好的语句是由数据库而不是您的代码创建和执行的。要自己实现它们,您必须实现 MySQL 协议并直接与数据库通信。

以下是准备好的语句的工作原理:

  • 您将带有占位符的查询发送到 RDBMS
  • RDBMS 存储查询并预先计算执行计划
  • 您分别告诉数据库执行语句,并传递值以绑定到其参数
  • RDBMS 使用这些值执行其存储的计划
于 2012-08-28T02:35:32.820 回答
2

有两种类型的预准备语句,模拟预准备语句和本机预准备语句。您正在做的是模拟准备好的语句。


1.如何创建MySQL准备好的语句?

在 php 级别,您只能通过将占位符替换为安全值来模拟准备好的语句。(例如:引用字符串,转义特殊字符,等等......)

2.为什么安全?

因为准备好的语句阻止了 sql 注入。


PS: PDO 有PDO::ATTR_EMULATE_PREPARES选项,它启用或禁用准备语句的模拟。

于 2012-08-28T02:35:33.700 回答