在Rust SQLx中使用push_bind实现ILIKE动态查询的问题
Rust SQLx动态查询中push_bind的问题与解决
push_bind的工作原理
push_bind是SQLx专为防范SQL注入设计的参数绑定方法:
- 它不会把参数值直接拼接进SQL字符串,而是在SQL中插入对应参数的占位符(比如PostgreSQL用
$1、MySQL用?)。 - 参数值会被单独存入查询的参数列表,由数据库在执行时安全解析,彻底避免用户输入引发的注入风险。
- 而
push是直接将传入的字符串原封不动拼进SQL,虽然能得到结果,但如果用户输入包含SQL关键字,就会触发注入漏洞,绝对不能用于处理用户输入。
你的代码为什么出错
你原来的push_bind写法生成的SQL片段是:
AND "Test" ilike '%$1%'
这里的$1被包裹在SQL的字符串常量'%$1%'里,数据库会把它当成普通文本,而非参数占位符,自然无法正确绑定你传入的test值,所以得不到预期结果。
正确的实现方式
有两种安全的写法可以实现ilike '%xxx%'的需求:
方式一:给参数值添加通配符后绑定
先把用户输入和通配符拼接成完整的匹配模式,再绑定这个模式:
if let Some(test) = ¶m.test { let like_pattern = format!("%{}%", test); query_builder.push(" AND \"Test\" ilike "); query_builder.push_bind(like_pattern); }
方式二:在SQL中用字符串拼接组合通配符和参数
利用数据库的字符串拼接语法,把通配符和参数占位符组合起来:
if let Some(test) = ¶m.test { query_builder.push(" AND \"Test\" ilike '%' || "); query_builder.push_bind(test); query_builder.push(" || '%'"); }
这种方式无需在Rust代码里拼接字符串,直接由数据库处理通配符和参数的组合,同样安全。
内容的提问来源于stack exchange,提问作者Tennie
相关产品推荐
相关产品推荐

