什么是参数化查询?

Posted

技术标签:

【中文标题】什么是参数化查询?【英文标题】:What is parameterized query? 【发布时间】:2011-06-10 08:49:57 【问题描述】:

什么是参数化查询,phpmysql 中的此类查询示例是什么?

【问题讨论】:

【参考方案1】:

参数化查询(也称为准备好的语句)是一种预编译 SQL 语句的方法,因此您需要提供的只是“参数”(想想“变量”)需要插入到语句中才能执行。它通常用作防止SQL injection attacks 的一种手段。

您可以在 PHP 的 PDO page(PDO 是一个数据库抽象层)上阅读更多关于这些的信息,但如果您使用 mysqli 数据库接口,您也可以使用它们(参见 prepare 文档)。

【讨论】:

@RJD22 不是真的 - 你刚刚发布了一个链接,我花时间解释了参数化查询是什么,为什么它们被普遍使用,以及它们可以在 PHP 中利用的两种方式。仅仅依靠外部链接通常是不受欢迎的,因为它们可能在未来消失/移动。 @RJD22 是的,特定链接非常不太可能发生变化。然而,这不是重点。如果 Stack Overflow 只是一系列外部链接,那么它的用处将大大减少,而且我添加了额外的信息,如果你不知道你在看什么,你必须在 PHP 网站上寻找相当多的信息才能找到为。 参数化查询和准备好的语句不是彼此不同吗? link @KennetCeleste 他们是;根据 API,您可以执行未准备好的参数化查询,并且可以制作包含不安全嵌入式用户输入的准备好的语句。我真希望人们不要再把这两个概念混为一谈了。【参考方案2】:

这是对它是什么以及它如何工作的清晰简洁的解释。 How and Why to use Parameterization [archive link]

该过程基本涉及服务器预处理不带参数的请求,因此它知道它是查询的类型。因此,例如 SELECT 查询只是一个 SELECT 查询,并且不能通过参数(请求变量)连接成为 SELECT / DROP 或其他 MySql 注入。相反,注入数据将只是参数字段中的字符串数据。

【讨论】:

您的链接已失效【参考方案3】:

该语句是数据库系统的特点之一,同一条SQL语句可以高效地重复执行。准备好的语句是一种模板,由不同参数的应用程序使用。Reference Article

数据库系统可以执行相同的SQL语句,而不需要对同一种SQL语句进行一次又一次的解析、编译和优化。

您可以在 MySQL 中编写或创建预准备语句,但这不是一种有效的方式,因为通过预准备语句 API 的二进制协议更好。

但您仍然可以编写,甚至不需要任何其他可以直接用 SQL 编写的编程。 您可以为 MySQL 客户端程序使用准备好的语句。您也可以在存储过程中使用准备好的语句用于动态 SQL 方法。

在 MySQL 中创建准备好的语句:reference is taken from this article

PREPARE TestStmt FROM 
'SELECT * FROM Test 
WHERE TestNumber=?';

您可以使用 PHP 代码通过其 API 管理预准备语句或在 JDBC 级别进行管理。

【讨论】:

【参考方案4】:

参数化查询是一种查询,其中占位符用于参数并且参数值在执行时提供。

为什么使用参数化查询

    使用参数化查询的最重要原因是避免 SQL 注入攻击。 第二个参数化查询负责处理 sql 查询可能失败的情况,例如在字段中插入 O'Baily。参数化查询处理此类查询,而不会强制您将单引号替换为双单引号。

【讨论】:

以上是关于什么是参数化查询?的主要内容,如果未能解决你的问题,请参考以下文章

Postman入门-参数化

参数化查询为什么能够防止SQL注入 (转)

如何编写参数化的 SQL 查询?

JMeter参数化之__CSVRead()

参数化查询如何帮助防止 SQL 注入?

参数化查询如何帮助防止 SQL 注入?