Django-Understanding X-Sendfile

Przeprowadziłem kilka badań dotyczących pobierania plików z kontrolą dostępu, używając Django. Moim celem jest całkowite zablokowanie dostępu do pliku, z wyjątkiem sytuacji, gdy dostęp do niego ma konkretny użytkownik. Czytałem, że używając Django, X-Sendfile jest jedną z metod wyboru, aby to osiągnąć (bazując na innych pytaniach SO, itp.). Moje podstawowe zrozumienie używania X-Sendfile z Django to:

  1. User requests URI to get a protected file
  2. Aplikacja Django decyduje, który plik zwrócić na podstawie adresu URL i sprawdza uprawnienia użytkownika itp.
  3. Aplikacja Django zwraca odpowiedź HTTP z nagłówkiem' X-Sendfile ' ustawionym na ścieżkę pliku serwera
  4. serwer sieci Web znajduje plik i zwraca go do requestera (zakładam, że serwer sieci Web usuwa po drodze nagłówek 'X-Sendfile')

W porównaniu z wyrzucaniem pliku bezpośrednio z Django, X-Sendfile wydaje się być bardziej wydajną metodą uzyskiwania chronionych pobrań (ponieważ mogę polegać na Nginx pliki, vs Django), ale pozostawia mi 2 pytania:

  1. Czy moje wyjaśnienie X-Sendfile jest przynajmniej abstrakcyjnie poprawne?
  2. czy jest to naprawdę bezpieczne, zakładając, że nie zapewniam normalnego, front-endowego dostępu HTTP (np. http://www.example.com/downloads/secret-file.jpg ) do katalogu, w którym plik jest przechowywany (tzn. nie przechowuj go w moim katalogu public_html)? Lub, może doświadczony technologicznie użytkownik zbadać nagłówki itp. i reverse engineer sposób, aby uzyskać dostęp do pliku (aby następnie rozpowszechniać)?
  3. czy to naprawdę duża różnica w wydajności. Czy mam zamiar wyłączyć mój serwer aplikacji, dostarczając 8B chunked downloads 150Mb plików bezpośrednio z Django, czy jest to coś w rodzaju non-issue? Powodem, dla którego pytam jest to, że jeśli obie wersje są prawie równe, Wersja Django byłaby lepsza ze względu na moją zdolność do robienia rzeczy w Pythonie, takich jak rejestrowanie liczby zakończonych pobrań, obliczanie przepustowości pobrań itp.
Z góry dzięki.
Author: orokusaki, 2011-09-04

1 answers

    Tak, tak to działa.
  1. dokładna implementacja zależy od serwera www, ale w przypadku nginx zaleca się oznaczyć lokalizację jako wewnętrzną, aby zapobiec zewnętrznemu dostępowi.
  2. Nginx może asynchronicznie obsługiwać pliki, podczas gdy w Django potrzebujesz jednego wątku na żądanie, co może być problematyczne dla większej liczby równoległych żądań.

Pamiętaj, aby wysłać nagłówek X-Accel-Redirect dla nginx zamiast X-Sendfile. Zobacz też http://wiki.nginx.org/XSendfile aby uzyskać więcej informacji.

 20
Author: Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-04 03:47:43