如何安全目录?以及如何在用户注册时创建新目录?

use*_*ser 5 python django django-1.3

我正在django创建一个视频共享网站.

目前,如果用户注册并上传视频,则会将其上传到media/vid/uploaded-vid.然后我使用ffmpeg转换为flv.我想做的是:

用户名为alex1的人注册,我想在确认他的电子邮件时为他创建一个目录/media/vid/members-vid/alex1

如果他上传了一个视频,它将被转换为flv media/vid/uploaded-vid然后复制到/media/vid/members-vid/alex1.视频输入media/vid/uploaded-vid应该被删除.

我想保证/media/vid/.你如何保护django目录?或者只是一个阿帕奇chmod

我想知道我是否可以使用celery/rabbitqm将文件从一个文件夹复制到另一个文件夹,或者创建新文件夹.

ilv*_*var 5

为避免有人上传shell或其他恶意代码,您不应将访问上传的文件授予外部客户端.因此,用户上传文件,而不是芹菜获取该文件并对其进行处理,将结果放入另一个Web服务器可访问路径.如果处理失败(即文件不是有效视频),则没有人可以访问它.但是通过正确的网络服务器设置(即拒绝从可用于上传的位置运行任何脚本),无论如何都应该没有大问题.

为了避免用户看到其他人的私人文件,您还可以将文件放在网站的媒体文件之外,并使用django的视图来检查访问权限+特殊的webserver指令,以实际服务文件而无需通过Django代理它.这些指令对于不同的服务器是不同的:


ror*_*ycl 3

您对保留目录的使用似乎是一个不错的选择。然而,以用户命名的目录是有风险的(如果有人提供了一个可执行命令名怎么办?),因此使用用户 ID 可能会更好。事实上,如果您将拥有大量用户,您可能需要考虑在一些常规目录下拆分用户目录,以便更容易地查找目录以实现管理目的,并且因为某些文件系统对目录下的条目数的限制相当低-- 例如 ext3 允许大约 32K 条目。

例如,一个粗略的用户目录方案,其中外部目录名为 1 到 9,子目录以这些数字开头,这将为您提供更多的灵活性。

因此,假设您上传的文件位于 中/tmp/upload/1015/,并且您希望将它们移动到/var/userdata/01/1015/中并处理文件/var/userdata/01/1015/,以下可能是一个明智的方法:

  • /tmp/upload/1015/需要是 apache 用户或组可写的
  • /tmp/upload/1015/记录在数据库、AMQP 调度服务(例如 RabbitMQ)或 RPC/Web 服务调用中处理文件的需要
  • 在其自己的用户 ID 下运行的调度服务客户端从 db/AMQP/web 调用中获取作业并执行以下操作
    • 运行病毒检查
    • 运行文件健全性检查以查看源文件是否符合预期
    • 将文件复制到用户文件夹
    • 如果成功,则删除原始文件(如果没有权限,则安排一个作业来执行此操作,或者依赖 cronjob 来删除/tmp/upload超过 24 小时的文件)
    • 尝试转换文件,更新数据库中的相关成功/失败标志
    • 完成后删除临时文件/不成功的源文件/输出文件

根据您的需要,该列表显然还会持续一段时间。最后,您将拥有一个用户目录,其中包含 apache 可读但 apache 用户不可写入的文件。如果您的服务增长,您可以将该服务的视频处理组件移至另一台服务器。

顺便说一下,Flickr 的 Cal Henderson 在他的 O'Reilly 著作“ Building Scalable Web Sites ”中对如何做此类事情(非常简单)做了很好的描述。它写于 2006 年,但他的方法是令人耳目一新的直接和直截了当。