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
如果您不希望用户使用通配符,请不要使用like。代替:
where position(? in name) > 0 请注意,这?是一个参数占位符,因此您不必用(危险的)用户输入来修饰查询字符串。
LIKE如果希望用户利用通配符,请使用(或更好的正则表达式)。否则,我看不出有什么好处。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。