2011-09-04 16 views
25

Django kullanarak, erişim kontrolü ile dosya indirme konusunda bazı araştırmalar yapıyorum. Amacım, belirli bir kullanıcının eriştiği durumlar haricinde bir dosyaya erişimi tamamen engellemektir. Django kullanırken X-Sendfile'nin bunu başarmak için tercih edilen yöntemlerden biri olduğunu okudum (diğer SO sorularına vb.). vb Django - X-Sendfile'yi Anlama

    1. Kullanıcı
    2. Django uygulaması URL'sini temel döndürülecek hangi dosya karar korumalı bir dosyayı almak için URI istekleri ve kontroller kullanıcı izni: Django ile X-SendFile kullanmanın Benim ilkel anlayış Django uygulaması, sunucunun dosya yoluna ayarlanmış 'X-Sendfile' başlığı ile bir HTTP Yanıtı döndürür
    3. Web sunucusu dosyayı bulur ve istekte bulunan kişiye döndürür (Webs sunucusunun da 'X-Sendfile'yi çıkardığını varsayalım Yol boyunca üstbilgi)

    Dosyanın doğrudan Django'dan kopyalanmasıyla karşılaştırıldığında, X-Sendfile korunan yüklemeleri elde etmenin daha verimli bir yöntemi gibi görünüyor (dosyalara ve Django'ya hizmet vermek için Nginx'e güvenebileceğimden), ancak benim için 2 sorudan ayrılıyor:

    1. X-Sendfile hakkındaki açıklamam en azından soyut bir şekilde doğru mu?
    2. Dosyanın saklandığı dizine normal, ön uç HTTP erişimi (ör. http://www.example.com/downloads/secret-file.jpg) sağlamadığım (yani, public_html dizinimde saklamıyorum) gerçekten güvenli midir? Ya da, bir teknoloji meraklısı kullanıcı başlıkları, vb incelemek ve bir dosyaya erişmek için ters mühendislik mühendisi olabilir (daha sonra dağıtmak için)?
    3. Gerçekten performans açısından büyük bir fark var mı? Uygulama sunucumu, doğrudan Django'dan 150bb dosyadan 8b parçalanmış indirmeler sağlayarak ya da bu tür bir sorun değil mi? Her iki sürüm eşit yakınında ise Django versiyonu tercih olacağından Bunu sormamın sebebi nedeniyle tamamlanmış indirme sayısını log gibi, Python şeyler yapmak için benim yeteneği, yüklemeler vb

    Teşekkür ait taksitli bant genişliğine olan önceden.

  • +0

    Yukarıda ana hatlarıyla anlattığınız adımlarda, bir şey bana açık değil: “Django uygulaması, X-Sendfile üstbilgi kümesi ile bir HTTP yanıtı döndürdüğünde, bu yanıtın alıcısı kim? Web sunucusu olacak (sanırım nginx). Öyleyse, ilk olarak Django uygulaması tarafından ele alınan isteği kim başlattı? – MLister

    +0

    @MLister - kullanıcı (web tarayıcısı) - temel olarak, get_file (istek, dosya_adı) 'gibi bir görünüm (bu etkiyle ilgili bir şey) ve bir kullanıcı URL’yi ziyaret ettiğinde, bir X-Sendfile, adlandırılmış dosya için doğru konuma işaret eder (kullanıcının dosyayı indirmesine izin verilip verilmediğini belirlemek için, görünümde istediğiniz mantığı ekledikten sonra).Nginx, cevabı kendi yolunda kesecek ve dosyaya bir yanıt verecektir (indirme olarak). – orokusaki

    +0

    bu yüzden 'nginx',' 'Django' uygulama sunucusunun önünde * kurulu olmalıdır? Aksi takdirde 'nginx' cevabı kendi yolunda nasıl durdurabilir? – MLister

    cevap

    19
    1. Evet, işte tam olarak böyle.
    2. Kesin uygulama web sunucusuna bağlıdır, ancak nginx durumunda, harici erişimi önlemek için konumu dahili olarak işaretlemeniz önerilir.
    3. Nginx, Django ile daha fazla sayıda paralel istek için sorun yaratabilecek istek başına bir iş parçacığına ihtiyacınız olduğunda dosyalarda eşzamansız olarak kullanılabilir.

    X-Sendifile yerine nginx için bir X-Accel-Yönlendirme başlığı göndermeyi unutmayın. Daha fazla bilgi için bkz. http://wiki.nginx.org/XSendfile.