在Rails中使用ilike时如何对%、&等特殊字符进行转义
Rails ilike模糊查询特殊字符转义方案
报错原因
- 原生ILIKE查询中
%、_属于SQL内置通配符,未转义直接传入用户输入的特殊字符时,会破坏原有SQL结构导致语法错误 - 直接拼接用户输入到查询条件中还存在SQL注入风险,输入
&等特殊字符触发报错也是同理
解决方法
使用Rails内置的sanitize_sql_like方法转义查询关键词,该方法会自动转义所有LIKE语法相关的特殊字符,适配PostgreSQL、MySQL等主流数据库。
基础写法
# 先转义用户输入的书名关键词 sanitized_book_name = ActiveRecord::Base.sanitize_sql_like(options[:book_name]) # 执行模糊查询,参数绑定的写法本身也会过滤非法SQL字符 books = Book.where("books.name ILIKE ?", "%#{sanitized_book_name}%")
进阶无原生SQL写法(推荐)
使用Arel表构造查询,避免手写SQL片段,可维护性和安全性更高:
book_arel = Book.arel_table sanitized_book_name = ActiveRecord::Base.sanitize_sql_like(options[:book_name]) # matches方法第三个参数设为true,对应大小写不敏感的ILIKE查询 books = Book.where(book_arel[:name].matches("%#{sanitized_book_name}%", nil, true))
补充说明
- 如果需要自定义转义符,可以给
sanitize_sql_like传入第二个参数指定,例如ActiveRecord::Base.sanitize_sql_like(options[:book_name], '!')会用!作为转义符替代默认的\ - 转义后用户输入的
%、_等特殊字符会被当做普通文本匹配,不会触发通配符逻辑
内容的提问来源于stack exchange,提问作者Bhim rav
相关产品推荐
相关产品推荐

