面试题答案
一键面试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
值作为数据安全地传递给数据库查询。