【问题标题】:PHP & MySQL: Creating your own Prepared statement without using MySQLi and/or PDOPHP & MySQL:在不使用 MySQLi 和/或 PDO 的情况下创建自己的 Prepared 语句
【发布时间】:2012-08-22 12:46:12
【问题描述】:

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

非常感谢。

【问题讨论】:

  • 准备好的陈述不仅仅是逃避事情。特别是,一个真正的准备好的语句将由数据库编译,用于提供输入。

标签: php mysql pdo mysqli prepared-statement


【解决方案1】:

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

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

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

【讨论】:

  • 这意味着我不能使用 MySQL 而不是 MySQLi 进行真正的准备好的语句,对吗?因为我记得我读过一篇文章说 MySQL 不支持prepared statement
【解决方案2】:

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


1.如何创建MySQL预处理语句?

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

2.为什么它是安全的?

因为prepared statements阻止了sql注入。


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

【讨论】:

  • 感谢您回答@xdazz。无论如何,由于一些限制,我在这里尽量不使用 PDO 或 MySQLi。 MySQLi 带有 PHP5 对吗? PDO呢?并且在您的 PS PDO::ATTR_EMULATE_PREPARES 中是对准备好的语句的模拟。这是否意味着它不如真正的安全?
  • @user1478598 PDO 也来自 PHP5。 PDO::ATTR_EMULATE_PREPARES 不影响安全问题。
  • 老实说,我的网络服务器似乎有一个旧版本的php,所以实现这样的新东西会很危险,我没有升级它的权限。
  • @user1478598 对于旧版本的php,您可以使用PEAR::MDB2等类似的东西。
  • 明白。非常感谢。看来我必须坚持旧的风格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2018-06-06
  • 1970-01-01
  • 2019-03-22
  • 2011-06-26
  • 2012-03-27
  • 1970-01-01
相关资源
最近更新 更多