gpt4 book ai didi

ruby-on-rails - BLOBS的优缺点(安全性)

转载 作者:行者123 更新时间:2023-11-29 13:59:54 27 4
gpt4 key购买 nike

一年前,当我用一个简单的MySQL数据库为人们制作简单的PHP站点时,我被培养成认为在数据库中存储一个完整的图像是可能的,但这是一个糟糕的想法。相反,您应该将映像存储在文件系统中,并简单地将映像路径存储在数据库中。尽管我缺乏经验,但我从一开始就同意这一点。当您将数据库备份到外部服务时,它必须保持数据库的亮度,并使其在实际本地使用时更快。不过,后面这一点完全是推测,我希望有人能澄清我的理论:
当您将与对象相关联的图像作为BLOB存储在数据库中时,当您请求此对象时,是否将整个对象及其属性(包括大量图像信息)写入内存,即使不需要它?例如。

2.0.0p247 :001 > Object.column_names
=> ["id", "name", "blob"]
2.0.0p247 :001 > Object.first.blob
=> # not sure what this will return! I'm guessing a matrix-like wall of image information?
2.0.0p247 :003 > Object.first.name
User Load (0.8ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
=> "Kitty"

我知道调用 Object.first.blob将花费相当长的时间,因为我们正在检索大量图像信息。但是, Object.first.name是否会花费相同的时间,因为 Object.first会将所有内容, idnameblob都写入内存?如果这个问题的答案是肯定的,那就是永远不要使用blob的一个很好的理由。然而,如果答案是否定的,而且rails足够聪明,只向内存中写入请求的属性,那么blob突然变得非常有吸引力。
老实说,我真的在祈祷,你会说把图像存储在一个团块里是很好的。这会让事情变得更容易。备份将很简单。在一次“模块化”上传中备份站点的动态内容,而不是使用一些复杂的 whenever增强rake任务来确保路径和它们各自的图像被上传到外部位置,这会感觉非常好。
更重要的是,使用Rails绝对不可能使某些图像私有化。我搜得很高,搜得很低,我一直在问。得到了一些赞成票,但没有得到可靠的回应。没有在线教程。没有什么。一袋袋关于如何将图像存储在assets文件夹中的教程,但没有任何东西可以使图像私有化。
假设我有三种类型的用户, typeAtypeBtypeC。假设我有三种类型的图像。所以数据库模式如下:
图像
=> ["image_path","blob","type"]

用户
=> ["name","type"]

我想要的是用户只能请求以下内容:
A型:
只能查看类型为
无法查看B类型的图像
不能只查看C类型的图像
B类:
只能查看B类型的图像
无法查看类型为
不能只查看C类型的图像
C类:
只能查看C类型的图像
无法查看类型为
不能只查看B类型的图像
是的,我可以给你两种类型的用户和图像的例子,但我真的想确保你理解这个问题;我想到的实际系统将有数百个 types
就像我说的,这个想法很简单,但是我发现用rails是不可能的,因为所有的图片都存储在公共文件夹中!所以 typeB用户只需输入 /assets/typeAImage.jpg就可以了!见鬼,即使不是用户的人也能做到。
send_file方法对我不起作用,因为我没有按照sae的下载向他们发送图像,而是在视图中向他们显示图像*
现在,如果图像存储在数据库中,使用blob将非常巧妙地解决这个问题。我不确定实际的语法,但我可以在用户视图中执行以下操作:
<% if current_user.type == image.type do %>
<%= image_tag image.blob #=> <img src="/assets/typaAImage.jpg" alt="..." class="..."> %>
<% end %>

是的,你可以用一条路做同样的事情:
<% if current_user.type == image.type do %>
<%= image_tag image.path #=> <img src="/assets/typaAImage.jpg" alt="..." class="..."> %>
<% end %>

但就像我说的,甚至不是用户的人都可以简单地请求 /assets/typeAImage.jpg。如果存储在BLOB中就不可能做到这一点。
总之:
罂粟花有什么问题?我在Heroku上运行postgres数据库,每秒有几十个用户。所以是的,不是 Facebook,但也不是 Allegory on the Pointless of Life,所以性能很重要。他们也有一个强大的移动跟踪,所以速度是至关重要的。使用BLOBS会与此冲突吗?
如何在视图中显示存储在BLOB中的图像?
为了确认,blob允许我通过https向某些成员安全地显示安全的机密图像?
数据库备份速度如何?这会很成功,但我还是想备份图像,而且这是一个每晚都要做的事情,所以谁在乎它是否慢?对吗?
只要备份是加密的,图像就会是安全的,对吧?就像密码作为散列存储在数据库中一样,我是否也应该以加密格式存储我的超级机密blob?我想是的。。。你认为 bcrypt能胜任这项任务吗?我不明白为什么不。
这些家伙被认为是业余和懒惰的吗?
…最后还有一个加分(可能超出了问题的范围):
*=当我写这篇文章的时候,我在想‘是的,但是在视图中显示图像就是下载图像给他们。那么 send_file方法是否可以像我描述的那样创建私有映像,并使用文件系统存储映像?

最佳答案

回答第一个问题:是的,在rails中可以延迟加载一些属性,但是默认情况下Active Record不支持它There is a gem for this though。(默认情况下,DataMapper确实支持此功能,而且还有一个plugin for Sequel)。
对于第二部分:您的方法最大的缺点是性能。资产最好通过一个快速、静态的web服务器来提供,该服务器可以从文件系统加载文件,而不是通过一个动态应用程序。不建议阻塞数据库服务器来查询大型blob,特别是因为扩展数据库比扩展文件系统要困难得多。
最后一部分:可以使用各种选项向用户隐藏文件,并仅在需要时提供这些文件。其中一个选项是X-SendFile,或者X-Accel-Redir,您可以在Rails中的返回头中指定一个文件名,代理请求的web服务器(也支持这个头)将接收该文件并为该文件提供服务。这不是重定向,因此URL仍然是相同的,并且该文件仍然可以隐藏起来,不被正常访问。当然,要做到这一点,您必须通过web服务器将请求代理到rails,这通常至少在负载平衡级别已经发生,或者如果您使用的是passenger。
还要注意,在提供普通资产文件时也可以tell Rails to send X-SendFile headers
Also see this answer.

关于ruby-on-rails - BLOBS的优缺点(安全性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com