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

时间:2012-04-02 14:34:18

标签: python django django-1.3

我在django中创建了一个视频共享网站。

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

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

如果他上传了视频,则会将其转换为media/vid/uploaded-vid中的flv,然后复制到/media/vid/members-vid/alex1。并且应删除media/vid/uploaded-vid中的视频。

我想保证/media/vid/。你如何保护django目录?或者只是一个apache chmod

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

例如,对于以这些数字开头的子目录,外部目录名为1到9的原始用户目录方案将为您提供更多的灵活性。

因此,假设您已将上传的文件放在/tmp/upload/1015/中,并且您希望将它们移至/var/userdata/01/1015/并处理/var/userdata/01/1015/中的文件,则以下内容可能是明智之举:

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

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

顺便说一下,Flickr的Cal Henderson在他的O'Reilly书“Building Scalable Web Sites”中有一个非常好的描述如何做(非常简单)。它写于2006年,但他的方法令人耳目一新,直截了当。

答案 2 :(得分:1)

您可以将视频存储在mongoDB GridFS或类似内容中。因此,您不会遇到目录,存储,可执行文件......