首页 >后端开发 >Golang >如何使用未经验证的用户输入在 PostgreSQL LIKE 表达式中实现文字模式匹配?

如何使用未经验证的用户输入在 PostgreSQL LIKE 表达式中实现文字模式匹配?

Linda Hamilton
Linda Hamilton原创
2024-11-21 05:00:12523浏览

How Can I Achieve Literal Pattern Matching in PostgreSQL LIKE Expressions with Unvalidated User Input?

PostgreSQL 中未验证用户输入的 LIKE 表达式的文字模式匹配

将用户输入与 PostgreSQL 中的 LIKE 模式进行匹配时,必须转义特殊模式字符(例如“_”和“%”)可确保字面匹配。 PostgreSQL 要求使用反斜杠 () 或使用 ESCAPE 子句定义的自定义转义字符来引用这些字符。

例如,要按字面匹配“rob”,您需要转义任何包含下划线或百分号。但是,这里存在一个潜在的陷阱:如果您的用户输入也包含反斜杠,那么它们也需要转义。这可能会变得复杂并导致错误。

服务器端解决方案

为了优雅地处理这个问题,您可以利用 PostgreSQL 的 Replace() 函数将特殊字符替换为它们的值逃脱版本。这种方法有几个优点:

  • 它在服务器上执行,无需客户端处理。
  • 它转义所有必要的字符,确保一致性。
  • 即使用户输入除下划线和百分号之外还包含特殊字符,它也可以无缝工作。

例如,要按字面搜索“rob”,您可以使用以下查询:

SELECT * FROM users WHERE name LIKE replace(replace(replace(,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'

在此查询中:

  • $1 是用户输入的占位符。
  • replace($1,'^','^^') 转义任何插入符号输入字符串中的字符 (^)。
  • replace(replace($1,'^','^^'),'%','^%') 对输入中的任何百分号 (%) 进行转义string.
  • replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') 转义任何下划线 (_ ) 在输入字符串中。
  • ||'%' 将尾随百分号附加到搜索字符串以进行前缀匹配。
  • ESCAPE '^' 指定“^”作为转义字符,允许您可以转义三个特殊字符中的任何一个。

结论

通过使用服务器端替换和自定义转义字符,您可以确保文字模式匹配在 PostgreSQL 中,LIKE 表达式用于未经验证的用户输入。这种方法非常稳健,避免了注入漏洞,并简化了代码。

以上是如何使用未经验证的用户输入在 PostgreSQL LIKE 表达式中实现文字模式匹配?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn