Ruby on rails 保护select语句不受sql注入的影响

Ruby on rails 保护select语句不受sql注入的影响,ruby-on-rails,sql-injection,strong-parameters,Ruby On Rails,Sql Injection,Strong Parameters,我最近偶然发现了api的一部分,用户可以在其中查询特定字段: api/models?only=id,name 它是这样实现的: @model = Model.select params[:only] 我对这一行有一种很不好的感觉,我试着把sql注入代码的这一部分。。。它成功了 经过一番思考,我们想出了这个 @model = Model.select params[:only].split(',').map(&:to_sym) 这实际上阻止了注射。但这足以保护API的这一部分吗 在这

我最近偶然发现了api的一部分,用户可以在其中查询特定字段:

api/models?only=id,name
它是这样实现的:

@model = Model.select params[:only]
我对这一行有一种很不好的感觉,我试着把sql注入代码的这一部分。。。它成功了

经过一番思考,我们想出了这个

@model = Model.select params[:only].split(',').map(&:to_sym)
这实际上阻止了注射。但这足以保护API的这一部分吗

在这种情况下是否可以使用强参数

query_params.require(:only).permit(:id,:name)
不起作用,因为传递的字段是字符串并且没有方法许可证

您可以使用ActiveRecord::Base.sanitize

您可以使用ActiveRecord::Base.sanitize

您可以使用ActiveRecord::Base.sanitize

您可以使用ActiveRecord::Base.sanitize


实际上,控制器不应该利用模型的实现细节。SQL的select中的值是逗号分隔的,并且API接受它们,这是一个巧合,一开始就不应该依赖它

我将向您介绍一些您可能觉得有用的工具,以便编写解决方案

数组&,集合交集 [1, 2, 3] & [2, 4, 1] => [1, 2] 模型属性 Model.attributes=>['id','name',…] 您可以过滤生成的数组以生成列的白名单 将数组放入参数列表中 Model.select*params[:only].split','和Model::select\u白名单 …显然,上述常数必须在模型内部定义。
实际上,控制器不应该利用模型的实现细节。SQL的select中的值是逗号分隔的,并且API接受它们,这是一个巧合,一开始就不应该依赖它

我将向您介绍一些您可能觉得有用的工具,以便编写解决方案

数组&,集合交集 [1, 2, 3] & [2, 4, 1] => [1, 2] 模型属性 Model.attributes=>['id','name',…] 您可以过滤生成的数组以生成列的白名单 将数组放入参数列表中 Model.select*params[:only].split','和Model::select\u白名单 …显然,上述常数必须在模型内部定义。
实际上,控制器不应该利用模型的实现细节。SQL的select中的值是逗号分隔的,并且API接受它们,这是一个巧合,一开始就不应该依赖它

我将向您介绍一些您可能觉得有用的工具,以便编写解决方案

数组&,集合交集 [1, 2, 3] & [2, 4, 1] => [1, 2] 模型属性 Model.attributes=>['id','name',…] 您可以过滤生成的数组以生成列的白名单 将数组放入参数列表中 Model.select*params[:only].split','和Model::select\u白名单 …显然,上述常数必须在模型内部定义。
实际上,控制器不应该利用模型的实现细节。SQL的select中的值是逗号分隔的,并且API接受它们,这是一个巧合,一开始就不应该依赖它

我将向您介绍一些您可能觉得有用的工具,以便编写解决方案

数组&,集合交集 [1, 2, 3] & [2, 4, 1] => [1, 2] 模型属性 Model.attributes=>['id','name',…] 您可以过滤生成的数组以生成列的白名单 将数组放入参数列表中 Model.select*params[:only].split','和Model::select\u白名单 …显然,上述常数必须在模型内部定义。
你可以用标题发送你的参数。我认为你不需要做任何其他事情。这是完全证明。你可以在标题中发送你的参数。我认为你不需要做任何其他事情。这是完全证明。你可以在标题中发送你的参数。我认为你不需要做任何其他事情。这是完全证明。你可以在标题中发送你的参数。我认为你不需要做任何其他事情。这是充分的证明。这似乎是一种优雅的方式。我要试试。这似乎是一种优雅的方式。我要试试。这似乎是一种优雅的方式。我要试试。这似乎是一种优雅的方式。我会试试的。谢谢你的建议。我看起来是一个很好的解决方案,但它不适用于示例中的逗号分隔列表。谢谢您的建议。我看起来是一个很好的解决方案,但它不适用于示例中的逗号分隔列表。谢谢您的建议。我看起来是一个很好的解决方案,但它不适用于示例中的逗号分隔列表。谢谢您的建议。我看起来是一个很好的解决方案,但它不适用于示例中的逗号分隔列表。
Model.select Model.sanitize(params[:only])