在Ruby on Rails 7中如何配置Active Record防止SQL注入?

冬杰君_8966

冬杰君_8966

2026-06-16

670人浏览

原创

active record 在 rails 7 中默认防 sql 注入,但仅限参数化查询;字符串插值(如 "name = '#{params[:name]}'")会绕过所有防护,必须使用问号占位符、哈希或命名绑定,动态字段(如 order)需白名单校验。

在ruby on rails 7中如何配置active record防止sql注入?

Active Record 在 Rails 7 中默认就防 SQL 注入——但只对参数化查询部分生效。你不需要额外配置,也不该去“开启”某个开关;真正决定是否安全的,是你写查询时有没有绕过它的绑定机制。


为什么 User.where("name = '#{params[:name]}'") 依然会中招

这种写法直接把用户输入插进字符串,Active Record 完全不介入、不转义、不拦截。日志里能看到原始 SQL 被拼进去,且值没加引号或转义,说明已跳过所有防护层。

常见错误现象包括:

  • 查询返回意外多条记录(比如 params[:name] = "admin' OR '1'='1")
  • 数据库报错如 PG::SyntaxError 或 SQLite3::SQLException,提示 SQL 结构异常
  • User.find_by("email = '#{params[:email]}'") 在开发日志中显示未加引号的 raw value

根本原因:字符串插值绕过了 Active Record 的参数绑定,交由数据库驱动直译——MySQL、PostgreSQL、SQLite 全部等效裸奔。


where 和 find_by 必须用参数化写法

两者语义不同,但防注入逻辑一致:必须走问号占位符或哈希传参。

Vinteo AI
Vinteo AI

Vinteo AI是一款面向室内设计和电商视觉的 AI 空间效果生成工具。

下载
  • User.where("email = ? AND active = ?", params[:email], true) —— 顺序绑定,最通用
  • User.where(email: params[:email], active: true) —— 哈希写法,自动处理字段名和值,推荐用于简单等值条件
  • User.find_by("email = :email", email: params[:email]) —— 命名绑定可行,但不如哈希直观,少用
  • User.find_by("email = '#{params[:email]}'") —— ❌ 禁止。哪怕加了 strip、presence 或正则校验也拦不住注入

注意:find_by 返回单个实例或 nil,where 返回关系对象(可链式调用),选哪个取决于业务逻辑,不是安全差异点。


order/group/having 这类动态字段必须白名单校验

order 不接受 ? 占位符,所以 User.order("#{params[:sort]} #{params[:dir]}") 是高危操作——攻击者传 params[:sort] = "email; DROP TABLE users; --" 就能执行任意 SQL。

  • 字段名必须来自白名单:%w{email name created_at}.include?(params[:sort]) ? params[:sort] : "created_at"
  • 排序方向也需校验:%w{asc desc}.include?(params[:dir]) ? params[:dir] : "desc"
  • 更健壮的做法是用 User.column_names 动态生成白名单,避免硬编码遗漏
  • 不要依赖 ActiveRecord::Base.sanitize_sql 处理字段名——它只处理值,不处理结构

容易被忽略的一点:白名单必须在进入 order 前完成,不能靠数据库层或中间件补救。


raw SQL 查询(如 find_by_sql)必须手动 sanitize

一旦调用 User.find_by_sql("SELECT * FROM users WHERE name = '#{params[:name]}'"),Active Record 的防护完全失效。

  • 唯一安全方式是配合 ActiveRecord::Base.sanitize_sql_for_conditions 或 connection.quote 手动转义值(仅限值,不保字段)
  • 例如:User.find_by_sql(["SELECT * FROM users WHERE name = ?", params[:name]]) —— 这种仍走参数化,可用
  • 但 User.find_by_sql("SELECT * FROM users ORDER BY #{params[:sort]}") 必须先白名单校验 params[:sort]
  • Rails 7 中 sanitize_sql 已标记为私有方法,不建议直接调用;优先重构为 ActiveRecord 链式调用

复杂点在于:很多老项目把搜索逻辑塞进 find_by_sql,改起来要动业务耦合点,这时白名单 + 字段名映射表(如 {'user_email' => 'email'})比硬编码更可持续。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

5016

5

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

2025.12.08

1249

12

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

243

5

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

466

22

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4263

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1109

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6161

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3003

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.3万人学习