控制器中可能的 SQL 注入

Possible SQL injection in a controller

提问人:richard_ba 提问时间:5/27/2021 更新时间:5/28/2021 访问量:131

问:

我在 Ruby 中有这段代码,我相信它可能是 SQL 注入点

@remaining_mdls = @remaining_mdls&.where("\"#{paginated_params_name}\" > ?", paginated_params_val) if paginated_params_val.present?

此方法检查某些对象的可用性,但我认为它可以用于恶意目的。

这安全吗?

Ruby-on-Rails 模型-视图-控制器 方法参数 SQL-注入

评论

0赞 Siim Liiser 5/27/2021
这取决于来自哪里。paginated_params_name

答:

0赞 alf 5/28/2021 #1

是的。您正在插值 . 最简单的解决方法是验证是否包含在已知列列表中:paginated_params_namepaginated_params_name

ALLOWED_PAGINATED_PARAMS = %w(created_at updated_at ...)

if paginated_params_val.present?
  unless ALLOWED_PAGINATED_PARAMS.include?(paginated_params_name)
    fail "Unknown pagination param '#{paginated_params_name}'" 
  end
  @remaining_mdls = @remaining_mdls&.where("\"#{paginated_params_name}\" > ?", paginated_params_val)
end

评论

0赞 richard_ba 5/28/2021
paginated_params_name 是一种方法,它返回如下内容 这是实现这一目标的最简单方法吗?@paginated_params_name ||= request.headers['X-Pagination-Param'] || params[:paginated_param]
0赞 alf 5/28/2021
是的。否则,黑客可以使用自定义的“X-Pagination-Param”构建请求并运行 SQL 注入攻击。您描述的方法具有记忆功能:它将标头值缓存在变量中,以便在多次调用该方法时可以快速访问该值,因此此代码应该不会对性能产生任何影响。