Pracuję nad scenariuszem, w którym niektóre pliki JavaScript mają być hostowane w sieci CDN. Chcę mieć pewien mechanizm, dzięki któremu po pobraniu tych plików po stronie użytkownika mogę zapewnić, że pliki nie zostały zmodyfikowane i rzeczywiście pochodzą z określonego CDN.
Rozumiem, że zadanie jest bardzo łatwe, jeśli używam SSL, ale nadal chcę mieć pewność, że odpowiednie pliki są obsługiwane nawet na HTTP bez SSL.
O ile mogłem wyszukiwać, nie ma istniejącego mechanizmu, takiego jak podpis cyfrowy dla plików JavaScript, który jest obsługiwany na różnych platformach. Może nie jest to potrzebne?
Czy jest jakaś metoda wbudowana w przeglądarki, aby zweryfikować autora plików JavaScript? Czy jest coś, co mogę zrobić, aby to zrobić w bezpieczny sposób?
źródło
Odpowiedzi:
W rzeczywistości taka funkcja jest obecnie opracowywana pod nazwą Integralność Subresource . Zajrzyj do
integrity
atrybutu<script>
tagu. Chociaż nie jest jeszcze w pełni przyjęty we wszystkich dziedzinach , spełnia właśnie ten cel.Źródło
Źródło
Przykład:
<script src="https://example.com/example-framework.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script>
Pamiętaj jednak, że nie ochroni to Cię przed atakami Man in the Middle, jeśli przesyłasz swoje zasoby przez zwykły HTTP. W takim przypadku kod skrótu może zostać sfałszowany przez atakującego, co sprawi, że ochrona przed zmanipulowanymi plikami skryptów będzie bezużyteczna.
Z tego powodu, oprócz opisanych powyżej środków bezpieczeństwa, należy zawsze używać bezpiecznych połączeń HTTPS zamiast zwykłego HTTP.
źródło
https://code.jquery.com/
każdy, kto włamie się,code.jquery.com
może XSS na twoją witrynę, niezależnie od tego, czycode.jquery.com
jest dostępny przez HTTPS, czy nie . Dzięki tym kontrolom osoba atakująca może tylko uniemożliwić ładowanie skryptów, a nie zastąpić ich złośliwymi.Szukasz sprawdzania integralności zasobów podrzędnych .
Na przykład, oto fragment kodu jQuery CDN:
<script src="https://code.jquery.com/jquery-3.1.0.js" integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk=" crossorigin="anonymous"></script>
źródło
code.jquery.com
. Może to uchronić Cię przed zagrożeniemcode.jquery.com
.Zastrzeżenie: Jak zawsze, powinieneś traktować te mechanizmy jako użyteczne tylko podczas korzystania z https, ponieważ można je łatwo wyłączyć za pomocą MitM z http
Oprócz mechanizmu przedstawionego w powyższych odpowiedziach można również użyć nagłówków odpowiedzi http dotyczących zasad bezpieczeństwa treści na stronie nadrzędnej.
http://www.html5rocks.com/en/tutorials/security/content-security-policy/
Ten mechanizm istnieje już od jakiegoś czasu, więc obsługa przeglądarki jest prawdopodobnie całkiem dobra, po prostu sprawdź.
Ponadto, jeśli chcesz mieć pewność, że starsze niezgodne przeglądarki nie są niezabezpieczone, możesz dołączyć synchroniczny skrypt przekierowania u góry strony, na co nie zezwalają zasady.
źródło
Jest ważna kwestia dotycząca tego, co ten rodzaj podpisywania może, a czego nie może zrobić. To może chronić użytkownika przed atakami hipotetycznych, w których ktoś modyfikuje kod. Nie może zapewnić Twojej witryny, że kod jest wykonywanym kodem. Innymi słowy, nadal nie możesz ufać niczemu, co przychodzi do Twojej witryny od klienta.
źródło
Jeśli Twój model przeciwnika pozwala atakującemu na modyfikowanie plików JavaScript w momencie, gdy są one dostarczane z CDN, wówczas Twój model przeciwnika pozwala atakującemu na modyfikację źródła odsyłającego w momencie, gdy jest ono dostarczane, w celu usunięcia wszelkich prób weryfikacji, zmiany adresu źródłowego na inny niż CDN i / lub całkowicie usunąć odniesienie do JavaScript.
I nie otwierajmy puszki z robakami, w której aplikacja może określić, czy program rozpoznawania nazw użytkownika poprawnie rozwiązuje problem w sieci CDN za pośrednictwem żądań HTTP (lub innego mechanizmu, który nie ma zweryfikowanego łańcucha zaufania).
/ etc / hosts:
# ... 1.2.3.4 vile-pirates.org trustworthy.cdn # ...
źródło
Możesz to zapewnić dzięki Integralności Subresource. Wiele publicznych sieci CDN zawiera skróty SRI w osadzanym kodzie oferowanym na stronach internetowych CDN. Na przykład na PageCDN, po kliknięciu pliku jquery na stronie jQuery CDN , możesz skopiować adres URL lub użyć tagu script zawierającego hash SRI, jak poniżej:
<script src="https://pagecdn.io/lib/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
Po załadowaniu strony przeglądarka wyśle żądanie dotyczące tego zasobu, a po zakończeniu żądania dopasuje hash otrzymanego pliku z wartością podaną jako wartość integralności w tagu skryptu. Jeśli oba skróty nie pasują, przeglądarka odrzuci plik jquery.
W tej chwili ta funkcja jest obsługiwana przez 91% przeglądarek na całym świecie. Więcej szczegółów na temat caniuse .
źródło