2010-10-13 6 views
5

Mamy wewnętrzną aplikację internetową, która działa jako repozytorium, do którego użytkownicy mogą przesyłać pliki. Pliki te mogą mieć dowolny format, w tym strony HTML.Jak można uniknąć XSS w plikach do pobrania w formacie HTML?

Testowaliśmy niż w IE8, jeśli pobieramy plik HTML zawierający skrypt, który próbuje uzyskać dostęp do plików cookie, a po pobraniu wybierz opcję "Otwórz", skrypt wykonuje i pobiera informacje o plikach cookie bez problemy w ogóle.

W rzeczywistości skrypt ten mógłby użyć obiektu XmlHttpRequest w celu wywołania serwera i wykonania złośliwych operacji w sesji użytkownika, który pobrał plik.

Czy można tego uniknąć? Sprawdziliśmy, że zarówno Chrome, jak i Firefox nie pozwalają na to. Jak można tego zachowania uniknąć w dowolnej przeglądarce, w tym w IE8?

+2

Co właściwie oznacza "Otwórz"? Pokaż stronę w przeglądarce? Jeśli tak, jaki jest adres URL strony, gdy tak się dzieje? – bzlm

+0

@bzlm: To jak z dowolnym przywiązaniem; jeśli zmusisz przeglądarkę do podpowiedzi do okna pobierania (które zawiera zawartość), możesz kliknąć Otwórz, a otworzy się przy użyciu adresu URL używanego do załadowania go, który jest oczywiście w tej samej domenie co jego pliki cookie, stąd moja sugestia uruchamianie (pobieranie) w alternatywnej domenie. –

+0

@bzlm znajduje się na właściwej ścieżce: jeśli otworzysz plik HTML lokalnie, nie będzie on mógł uzyskać dostępu do plików cookie ani wysyłać zapytań Ajax na serwer zdalny z powodu zasad dotyczących pojedynczej domeny. Tylko jeśli jest otwarty bezpośrednio na serwerze, który jest możliwy. –

Odpowiedz

5

Nie zezwalaj na przesyłanie zawartości arrange. To wyłącznie straszny pomysł.

Jednym z potencjalnych "rozwiązań" może być tylko hostowanie niezaufanych plików do pobrania w domenie, która nie ma plików cookie, i że użytkownik w żaden sposób nie kojarzy żadnego zaufania. Byłoby to "rozwiązanie", ale z pewnością nie jest idealne.

Niektóre bardziej praktyczne opcje mogą być oparte na autoryzacji, gdzie każdy plik przechodzi automatyczną weryfikację, a następnie ręczne potwierdzenie automatycznej fazy czyszczenia/analizy.

W sumie jednak bardzo zły pomysł, aby umożliwić to ogółowi społeczeństwa.

+1

+1 za przechowywanie uploadów w innej domenie i ogólne przekonanie, że jest to zawsze niebezpieczne –

+0

Rozważymy opcję pobierania plików z innej domeny i będziemy mieć oko na system, aby sprawdzić, czy w końcu zmuszony do odrzucenia każdego niebezpiecznego uploadu. Bardzo dziękuję za pomoc. –

+0

[Wydania GitHub] (https://github.com/cirosantilli/test/releases/tag/3.0) pozwalają na dowolne rozszerzenie i wydają się używać rozwiązania domeny przez S3. Dropbox pozwala również na dowolne typy plików. –

1

Jeśli naprawdę chcesz, aby użytkownicy przesyłają pliki HTML, upewnij się, że pliki HTML w tym katalogu są podawane z tekstem typu MIME/zwykłym zamiast tekstem/html lub podobnym.

Uniemożliwi to uruchamianie skryptów w przeglądarce przez otwarte pliki. Jeśli używasz Apache, zobacz dyrektywę AddType.

+0

To jest dobra sugestia i może załatwić sprawę. Nadal byłbym zaniepokojony serwowaniem treści z tej samej domeny, ale myślę, że powinno to być zrobione niezależnie. –

+0

Uważaj na sniffowanie treści. Ponieważ Apache jest domyślnie dostarczany z 'text/plain' dla nieznanych plików, przeglądarki są zmuszone traktować' text/plain' jako zaproszenie do odgadnięcia właściwego typu. – Kornel

4

To naprawdę zły pomysł z punktu widzenia bezpieczeństwa. Jeśli jednak chcesz to zrobić, dołącz nagłówek odpowiedzi HTTP Content-disposition: attachment Zmusi to przeglądarkę do pobrania pliku zamiast jego otwarcia. W Apache, robi się to dodając Header set Content-disposition "attachment" do pliku .htaccess.

Zauważ, że to zły pomysł, aby dodać Content-type: text/plain, jak wspomniano w jednej z odpowiedzi, ponieważ nie będzie działać dla Internet Explorera. Kiedy IE otrzymuje plik z tekstowym nagłówkiem typu content, włącza swój sniffer MIME, który próbuje zdefiniować prawdziwy typ zawartości pliku (ponieważ niektóre serwery wysyłają wszystkie pliki z tekstem/zwykłym). W przypadku gdy spełnia on kod HTML wewnątrz pliku, zmusi przeglądarkę do wyświetlenia pliku jako tekst/html i renderowania go.

+0

[Ten wpis na blogu] (http://i8jesus.com/?p=64) mówi, że samo "Content-Disposition" to za mało, ale nie wiem wystarczająco dużo, aby powiedzieć, jak wiarygodne jest i czy nadal ma zastosowanie. –