MST

星途 面试题库

面试题:Ruby on Rails 中如何防止 SQL 注入攻击

在 Ruby on Rails 项目中,详细阐述至少两种防止 SQL 注入攻击的方法,并举例说明如何在代码中实现。
50.0万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

1. 使用参数化查询(占位符)

在 Rails 中,ActiveRecord 提供了参数化查询的功能。例如,假设我们有一个用户登录的场景,需要根据用户名和密码查询用户:

# 错误的方式,容易遭受 SQL 注入攻击
username = params[:username]
password = params[:password]
user = User.where("username = '#{username}' AND password = '#{password}'").first

# 正确的方式,使用参数化查询
username = params[:username]
password = params[:password]
user = User.where("username =? AND password =?", username, password).first

在上述代码中,? 就是占位符,实际的值通过后续的参数传递进去,这样数据库会将传入的值作为数据处理,而不是 SQL 代码的一部分,从而防止了 SQL 注入。

2. 使用 ActiveRecord 的动态查询方法

ActiveRecord 提供了许多动态查询方法,这些方法会自动处理参数化,避免 SQL 注入。例如,我们要根据用户邮箱查找用户:

# 错误的方式,手动拼接字符串存在风险
email = params[:email]
user = User.where("email = '#{email}'").first

# 正确的方式,使用动态查询方法
email = params[:email]
user = User.find_by(email: email)

这里 find_by 方法会自动对参数进行处理,确保不会发生 SQL 注入攻击。它会将传入的 email 值作为数据安全地传递给数据库查询。