Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails SQLI在Show中。这可能吗?_Ruby On Rails_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails SQLI在Show中。这可能吗?

Ruby on rails SQLI在Show中。这可能吗?,ruby-on-rails,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 5,在rails 5中,我有一个显示页面,在该页面上我使用以下内容查询@client: <% for client in @client.nearbys(500, :units => :km).where("(membertype_id = 3) OR (membertype_id = 4)") :km)。其中(((membertype\u id=3)或(membertype\u id=4) 。。问题是关于.where语句。.where语句在SQL注入或其他攻击中是否安全?如果没有,

在rails 5中,我有一个显示页面,在该页面上我使用以下内容查询@client:

<% for client in @client.nearbys(500, :units => :km).where("(membertype_id = 3) OR (membertype_id = 4)")
:km)。其中(((membertype\u id=3)或(membertype\u id=4)
。。问题是关于.where语句。.where语句在SQL注入或其他攻击中是否安全?如果没有,你还会用什么方式写这篇文章


编辑:我的路线和控制器中只有一个显示操作

视图中的这种逻辑在某种意义上是错误的,视图层不负责从数据库中查询数据——它的任务是显示数据

将其移动到控制器,然后只需在视图中使用
@clients
实例变量:

def show
  # equal to @client.nearbys(500, units: :km).where(membertype_id: [3,4])
  @client = @client.nearbys(500, :units => :km).where("(membertype_id = 3) OR (membertype_id = 4)")
end
这样就不用担心安全问题了

编辑
正如我在评论中所说,将其硬编码(正如您所做的)与将其硬编码到模型或控制器中一样安全-没有区别。

您似乎并不真正理解SQL注入首先是什么:

当您从用户获取输入并使用它构造SQL查询字符串时,就会出现SQL注入漏洞

User.where("foo = #{params[:bar]}")
因此,如果用户通过
“'foo');放下表'users';-”
你就完蛋了

User.where("foo = ?", params[:bar])
另一方面,由于数据库使用单独提供的值替换
,因此不存在此漏洞。因此,它会引用
“'foo');删除表'users'
,这样它就只是作为一个值插入

以下文件中不存在SQLI漏洞:

@client.nearbys(500, :units => :km).where("(membertype_id = 3) OR (membertype_id = 4)")
因为您没有插入任何用户输入

但这仍然是错误的。 在MVC中,应该避免在视图中执行数据库查询。您的视图应该只从控制器获取数据并使用它生成HTML


在视图中执行查询会导致代码重复、数据库优化效果差等。

我明白您的观点,我知道这可能不是正确的方法。但情况是,我需要以我的观点来做这件事。我在show view中有大约100多条此类语句。如果我把它们放在控制器里,它就不会是一个瘦小的控制器。我应该把它们放在一个范围内,然后创建一个fat模型吗?然后在视图中调用@client上的作用域?无论如何,谢谢你的帮助,但我最感兴趣的是语句本身是否安全。是吗?@sneglefar我不相信一定有100多条语句,例如,它们不能被推广到范围内。至于安全性-它是安全的,而它是硬编码的,如您的示例中所示。一旦你使用params,你就必须对它们进行清理。我不想重复我的问题,但是100+语句似乎是必要的,至少对于我的初学者ruby级别,因为我正在做一个相关的部分,针对6个不同的类别,有9到10个不同的选项来查找相关的客户端-我的设置中确实有100个不同的选项。但是回到正轨:如果我在我的视图中这样做,而不是在控制器或作用域中,那么与它在我的控制器中或在我的模型中作为作用域相比,它是否不安全?@snegle正如我所说的,虽然在查询中不使用用户输入,但它与在模型或控制器中保存它一样安全。因为我有这么多语句,我只想知道它是否安全,因此,我可以启动我的应用程序,同时我会清理稍后编写代码的方式,并将其移动到适当的位置。max和@Andrey Deineko,你不能责怪sneglefar在视图中执行SQL。我理解你的观点,并会给出同样的建议,但只是作为一个建议,因为DHH说,正如Rails Way(7:19)所说,在视图中执行SQL查询是一件好事,因为它可以缓存。DHH有时会说一些非常愚蠢的事情。查询由AR缓存在db驱动程序级别,在大多数情况下,当您使用片段缓存时,在您开始对集合执行某些操作之前,实际上不会执行查询。在视图中随意地查询是一个很好的方式来创建wordpress风格的混乱。谢谢所有的评论。然而,我不明白当有这么多(100)个不同(必要)的查询时,控制器中如何建议这样做。这确实会使它成为一个脂肪控制器。那么,将它们作为范围放在模型中不是更好吗?正因为如此,我的浏览量很大,所以我理解并感谢您的建议。您将请求和数据库查询混为一谈。完全不同。只需使用哈希而不是字符串来创建查询,您就不必担心SQL注入。您是否使用视图中客户端的任何属性,其中属性值由外部服务或您不信任的用户填充?如果是,如何在视图中使用此属性?