2012-04-02 38 views
5

Tôi đang tạo trang web chia sẻ video bằng django.Thư mục bảo mật như thế nào? Và cách tạo thư mục mới khi người dùng đăng ký?

Hiện tại, nếu người dùng đăng ký và tải video lên, video đó sẽ được tải lên media/vid/uploaded-vid. Sau đó, tôi chuyển đổi bằng cách sử dụng ffmpeg để flv. Những gì tôi muốn làm là thế này:

người với tên người dùng của alex1 đăng ký, tôi muốn tạo một thư mục cho ông khi ông khẳng định email của mình, được gọi là /media/vid/members-vid/alex1

Nếu anh tải lên một video, nó sẽ được chuyển thành flv trong media/vid/uploaded-vid rồi sao chép sang /media/vid/members-vid/alex1. Và video trong media/vid/uploaded-vid sẽ bị xóa.

Và tôi muốn bảo mật /media/vid/. Làm thế nào để bạn an toàn thư mục django? Hoặc chỉ là một apache chmod?

tôi đã tự hỏi nếu tôi có thể sử dụng cần tây/rabbitqm để sao chép tập tin từ một thư mục khác, hoặc để tạo thư mục mới ..

+0

Bảo mật từ những gì? – mikerobi

+0

@mikerobi từ tin tặc, tôi muốn biết cách an toàn nhất để lưu trữ video trên máy chủ của mình là gì – user

+0

Ý tôi là, bạn đang cố gắng bảo vệ ai đó truy cập video riêng tư trên web hoặc nếu ai đó truy cập vào máy chủ của bạn ? – mikerobi

Trả lời

3

Việc bạn sử dụng một thư mục nắm giữ có vẻ là một tốt nhất. Tuy nhiên có thư mục được đặt tên sau khi người dùng là nguy hiểm (nếu ai đó cung cấp một tên mà là một tên lệnh thực thi?) Vì vậy, bằng cách sử dụng id người dùng có thể là tốt hơn. Thật vậy, nếu bạn có nhiều người dùng, bạn có thể muốn xem xét việc chia nhỏ các thư mục người dùng theo một số thư mục chung để tìm kiếm các thư mục dễ dàng hơn cho mục đích quản trị, và bởi vì một số hệ thống tập tin có giới hạn khá thấp về số lượng các mục trong thư mục -- ví dụ ext3 cho phép khoảng 32K mục. Ví dụ: một lược đồ thư mục người dùng thô với các thư mục bên ngoài có tên từ 1 đến 9 cho các thư mục con bắt đầu bằng những con số đó sẽ giúp bạn linh hoạt hơn một chút ở đây.

Vì vậy, giả sử bạn có file tải lên của bạn trong /tmp/upload/1015/, và bạn muốn di chuyển chúng đến /var/userdata/01/1015/ và các tập tin quá trình trong /var/userdata/01/1015/, sau đây có thể là một cách tiếp cận hợp lý:

  • /tmp/upload/1015/ sẽ cần phải được sử dụng apache hoặc nhóm có khả năng ghi
  • kỷ lục sự cần thiết phải xử lý tập tin trong /tmp/upload/1015/ trong một cơ sở dữ liệu, dịch vụ lập lịch trình AMQP như RabbitMQ hoặc một RPC/dịch vụ web gọi
  • một khách hàng dịch vụ lập lịch trình chạy dưới userid riêng của mình nhặt t ông công việc từ db/AMQP/cuộc gọi web và không sau
    • chạy một kiểm tra virus
    • chạy một kiểm tra tập tin sự tỉnh táo để xem các tập tin nguồn là những gì nó mong
    • sao chép tập tin vào thư mục người dùng
    • nếu thành công, xóa tệp gốc (hoặc lên lịch công việc để thực hiện việc đó nếu không có quyền làm như vậy hoặc dựa vào cronjob để xóa tệp trong /tmp/upload hơn 24 giờ)
    • cố gắng chuyển đổi các tệp, cập nhật cờ thành công/thất bại có liên quan trong cơ sở dữ liệu khi nó đi dọc theo
    • xóa các tập tin tạm thời/nguồn không thành công/tập tin đầu ra trên các dữ liệu

Danh sách này rõ ràng là sẽ tiếp tục thêm một thời gian, tùy thuộc vào nhu cầu của bạn. Cuối cùng, bạn sẽ có một thư mục người dùng với các tập tin có thể đọc được bằng apache nhưng không thể ghi bởi người dùng apache. Nếu dịch vụ của bạn phát triển, bạn có thể di chuyển các thành phần xử lý video của dịch vụ này sang một máy chủ khác.

Bằng cách này, có một mô tả rất tốt về cách làm điều này (rất đơn giản) bởi Cal Henderson của Flickr trong cuốn sách O'Reilly "Building Scalable Web Sites" của mình. Nó được viết vào năm 2006 nhưng cách tiếp cận của anh ấy mới mẻ trực tiếp và thẳng thắn.

+0

+1. Đây là một câu trả lời hay. Một lời khuyên nữa là: bước chuyển đổi tệp sẽ là một phần của quá trình xử lý thực thi nhiều mã nhất, và mã này cũng sẽ là mã của bên thứ ba phức tạp (các codec và vv).Mã chính xác nào được thực thi sẽ nằm dưới sự kiểm soát của người dùng cuối (vì họ chọn loại tệp) và vì vậy mã này phải nằm trong số các phần đặc quyền cuối cùng của mã. Chắc chắn, đừng để nó chạy với đặc quyền để đọc cơ sở dữ liệu, hãy để một mình viết cho nó. –

5

Để tránh một ai đó tải lên một vỏ hoặc một số mã độc khác mà bạn không nên cung cấp cho truy cập để tải lên tệp cho các khách hàng bên ngoài. Vì vậy, người dùng tải lên một tệp, so với cần tây lấy tệp đó và xử lý tệp, đưa kết quả đến một tệp khác, đường dẫn truy cập máy chủ web. Nếu quá trình xử lý không thành công (tức là tệp không phải là video hợp lệ), thì không ai có thể truy cập nó. Nhưng với việc thiết lập máy chủ web chính xác (nghĩa là từ chối chạy bất kỳ tập lệnh nào từ các vị trí sẵn có để tải lên), nó cũng không phải là vấn đề lớn.

Để tránh người dùng xem tệp riêng tư khác, bạn cũng có thể đặt tệp bên ngoài tệp phương tiện của trang web và sử dụng chế độ xem của django để kiểm tra quyền truy cập + chỉ thị máy chủ web đặc biệt để thực sự máy chủ tệp mà không ủy quyền tệp qua Django. Những chỉ thị khác nhau cho các máy chủ diffeent:

+1

Tôi khuyên bạn nên sử dụng mô-đun [django-sendfile] (https://github.com/johnsensible/django-sendfile) để sử dụng các tính năng proxy của tệp. –

1

Có thể bạn nên lưu trữ video của mình ở mongoDB GridFS hoặc nội dung tương tự. Vì vậy, bạn sẽ không gặp bất kỳ sự cố nào với các thư mục, lưu trữ, các tệp thi hành ...

Các vấn đề liên quan