You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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) = &param.test {
    let like_pattern = format!("%{}%", test);
    query_builder.push(" AND \"Test\" ilike ");
    query_builder.push_bind(like_pattern);
}

方式二:在SQL中用字符串拼接组合通配符和参数

利用数据库的字符串拼接语法,把通配符和参数占位符组合起来:

if let Some(test) = &param.test {
    query_builder.push(" AND \"Test\" ilike '%' || ");
    query_builder.push_bind(test);
    query_builder.push(" || '%'");
}

这种方式无需在Rust代码里拼接字符串,直接由数据库处理通配符和参数的组合,同样安全。

内容的提问来源于stack exchange,提问作者Tennie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:32:52