PHP&;MySQL:在不使用MySQLi和/或PDO的情况下创建自己的Prepared语句


PHP & MySQL: Creating your own Prepared statement without using MySQLi and/or PDO

就像我的标题一样,我想知道如何在不使用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. 为什么它是安全的

非常感谢。

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

以下是准备好的报表的工作原理:

  • 您将带有占位符的查询发送到RDBMS
  • RDBMS存储查询并预先计算执行计划
  • 您分别告诉数据库执行该语句,并将绑定到其参数的值传递给数据库
  • RDBMS使用值执行其存储的计划

有两种类型的准备语句,模拟准备语句和本地准备语句。你正在做的是模仿事先准备好的陈述。


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

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

2.为什么它是安全的?

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


PS: PDO具有PDO::ATTR_EMULATE_REPREPARES选项,可启用或禁用已准备语句的模拟。