开发者社区> 问答> 正文

如何为SQL“ LIKE”运算符正确地转义用户输入?(Postgres)

LIKE 用户提供输入的操作员 Postgres LIKE运算符可用于向用户提供对表行的基本搜索。但是,LIKE由于某些字符(例如下划线(_))正在被解释,因此需要适当地转义用户为操作员提供的输入。始终建议通过Postgres 准备的语句传递用户提供的输入:

PREPARE getUsernames(text) AS SELECT "name" FROM "users" WHERE "name" LIKE '%' || $1 || '%'; EXECUTE getUsernames('_') 尽管通过预准备语句中的变量传递用户输入,但是下划线被LIKE运算符解释为通配符,因此上述SQL查询与users表中的每个条目匹配。

拟议的解决方案 用户希望搜索下划线会返回其中name包含下划线字符的所有结果(而不是将其解释为通配符)。因此,我们必须转义用户输入,以使LIKE操作员永远不会解释它。Postgres提供了转义字符的规范,默认情况下为反斜杠。因此,必须使用此转义字符对每个具有特殊含义的字符进行转义。但是,保持字符黑名单容易出错,因为总有黑名单不完整的可能性。因此,我提出的解决方案的想法是始终用户输入的每个字符都以转义字符开头,而不管它是否会真正被解释。Postgres接受这种转义字符,这些字符不需要转义。

这是用TypeScript编写的此用户输入转义的示例实现:

function escapePostgresLikeStr(str: string, escapeChar = '\'): string { return str .split('') .map(char => ${escapeChar}${char}) .join(''); }

我没有找到有关此特定问题的任何信息,因此欢迎您提供任何反馈,安全考虑和改进!:)

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 11:58:14 932 0
1 条回答
写回答
取消 提交回答
  • 如果您不希望用户使用通配符,请不要使用like。代替:

    where position(? in name) > 0 请注意,这?是一个参数占位符,因此您不必用(危险的)用户输入来修饰查询字符串。

    LIKE如果希望用户利用通配符,请使用(或更好的正则表达式)。否则,我看不出有什么好处。

    2019-11-18 11:58:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载