【问题标题】:Parameterized PDO statements: should trusted, constant values be parameterized?参数化 PDO 语句:是否应该参数化可信的常量值?
【发布时间】:2023-04-02 07:45:01
【问题描述】:
SELECT name FROM customers WHERE location = ? AND active = '1'

在此查询中,location 的值将来自不受信任的来源,但 active 的值将始终为 = 1。我正在使用 PDO用于 php/mysql。

我还应该参数化 active 的值吗?
如果 active 不是常数而是来自不断变化和受信任的来源,我还应该参数化吗?(即,为了缓存的好处?)

【问题讨论】:

  • 规则是:每当你将用户数据与查询混合时,使用参数化查询
  • 基于代码可读性/理解力的意见:如果其常量,则将其硬编码到 sql 中。赋予它变化的灵活性会让代码的读者想知道为什么/在哪里改变值。但是当硬编码时,一眼就可以说“啊,这个查询获得了所有活跃用户”

标签: php mysql pdo prepared-statement parameterized-query


【解决方案1】:

不,参数化常量值没有任何好处。

参数化的目的是允许应用程序数据与 SQL 表达式安全重复结合。安全的部分是防止 SQL 注入。重复部分是为了让您可以使用不同的值再次执行准备好的查询,这可能使 RDBMS 不必重新解析和重新优化查询。

如果您始终在查询中使用相同的常量值,这些都不是问题。您不会面临来自硬编码值的 SQL 注入风险,如果需要,您可以重新执行查询,而无需重新解析。

没有进行参数缓存。如果有的话,使用准备好的语句会使 MySQL 缓存结果(即query cache has limitation on caching results from prepared statements更难。但是一旦你使用准备好的语句,它是否有一个参数与两个或多个参数都无关紧要。


我确实想知道你为什么将整数放在引号中。我经常看到这种情况,但我不知道它是如何开始的,也不知道谁认为有必要。

【讨论】:

  • 想详细说明一下?是不是因为它们通常不会像搜索过滤器/等操作的其他值那样发生变化,因此没有任何缓存优势?还是因为根本没有安全威胁?我们参数化只是安全问题吗?
  • 我猜引号中的 1 是这样我不必担心数据库类型是否为整数。虽然这是一个软弱的论点。哈!我认为这种习惯的一部分来自于过去经常这样做:something = '".mysql_real_escape_string($untrusted)."' 并且非常小心地将这些引号包含在所有内容中。
  • 谢谢比尔!再澄清一点,您是说如果它不是恒定的,但仍然受信任,那么继续参数化它?
  • 是的,如果可能的话,我喜欢参数化所有应用程序变量,这样代码才能保持一致。我不喜欢直接在 SQL 字符串中看到任何变量(尽管我们不能参数化某些东西,例如表名、列名、SQL 表达式、关键字)。
猜你喜欢
  • 2017-02-28
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多