Jaki jest cel atrybutu „nonce” HTML dla elementów skryptów i stylów?

140

W3C mówi, że jest to nowy atrybut w HTML5.1 nazywane noncedla stylei scriptktóre mogą być stosowane w treści polityki bezpieczeństwa strony internetowej.

Wyszukałem w Google, ale w końcu nie rozumiem, co właściwie robi ten atrybut i co się zmienia, gdy go używam?

ata
źródło
2
Wygląda na to, że to tylko dodatkowe zabezpieczenie Twojej witryny, dodajesz ją do linku lub formularza, a kiedy strona jest wyświetlana, jeśli nonce nie pasuje do twojej, nie obsługujesz strony
Pete
@Pete Masz na myśli, że nikt nie mógł załadować Twojego scripti style? Coś w rodzaju blokady hotlink?
ata,
dotyczy to również zwykłych stron i sprawdzania poprawności formularzy
Pete

Odpowiedzi:

195

nonceAtrybut pozwala na „białej listy” pewne inline scripti styleelementów, unikając korzystania z CSP unsafe-inlinedyrektywy (która pozwoliłaby wszystko inline script/ style), dzięki czemu wciąż zachowują kluczową cechę CSP w postaci zablokowania inline script/ stylew ogóle.

Więc nonceatrybutem jest sposób mówienia przeglądarek że inline zawartość danego skryptu lub elementu stylu nie wstrzykiwano do dokumentu przez niektórych (szkodliwego) osoby trzeciej, ale były zamiast umieścić w dokumencie celowo przez tego, kto kontroluje serwer dokument jest serwowane z.

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it podaje dobry przykład użycia nonceatrybutu, co sprowadza się do następujących kroków:

  1. Dla każdego żądania, które Twój serwer WWW otrzyma dla określonego dokumentu, poproś zaplecze o wygenerowanie losowego ciągu co najmniej 128 bitów danych zakodowanych w base64 z szyfrowanego kryptograficznie generatora liczb losowych; np EDNnf03nceIOfn39fn3e9h3sdfa. To twoja nonce.

  2. Weź numer nonce wygenerowany w kroku 1 i dla każdego elementu inline script/, stylektóry chcesz nonceumieścić na białej liście, spraw , aby kod zaplecza wstawił atrybut do dokumentu przed wysłaniem go przez sieć , z tą wartością jednorazową jako wartością:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. Weź nonce wygenerowany w kroku 1, dołącz nonce-go przed nim i spraw , aby Twój backend wygenerował nagłówek CSP z tym jednym z wartości listy źródeł dla script-srclub style-src:

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

Tak więc mechanizm używania wartości jednorazowej jest alternatywą dla twojego zaplecza generującego skrót zawartości inline scriptlub stylechcesz zezwolić, a następnie określając ten skrót na odpowiedniej liście źródeł w nagłówku CSP.

Zwróć uwagę, że ponieważ przeglądarki nie mogą (nie mogą) sprawdzać, czy wartość jednorazowa wysyłała zmiany między żądaniami strony, możliwe jest - choć jest to całkowicie niewskazane - pominięcie 1 powyżej i nie zezwalanie zapleczu na nic może po prostu umieścić nonceatrybut ze statyczną wartością w źródle HTML twojego dokumentu i wysłać statyczny nagłówek CSP z tą samą wartością jednorazową.

Ale powodem, dla którego nie chciałbyś używać statycznej wartości nonce w ten sposób, jest to, że prawie całkowicie zniweczyłoby to cały cel używania wartości nonce na początku - ponieważ gdybyś użył takiej statycznej liczby nonce, w tym momencie równie dobrze możesz po prostu używać unsafe-inline.

Sidehowbarker
źródło
17
Nie służy do weryfikowania użytkownika - służy do sprawdzania, czy wbudowana zawartość określonego skryptu lub elementu stylu nie została wprowadzona do dokumentu przez moją jakąś (złośliwą) stronę trzecią, ale została celowo umieszczona w dokumencie przez osobę, która kontroluje dokument na serwerze jest obsługiwany z. (Zaktualizuję swoją odpowiedź, aby to powiedzieć.)
Sidehowbarker
3
Te wartości nie muszą być przechowywane - zamiast tego są generowane w pamięci i wstawiane do nagłówka CSP i dokumentu HTML, który jest przesyłany przewodem w odpowiedziach (nie do źródła przechowywanego w systemie plików / bazie danych serwera).
sideshowbarker
3
Jeśli chodzi o powód, dla którego noncewarto wkładać wysiłek w używanie atrybutu, jeśli absolutnie nie musisz go używać, nie rób tego. Jest to tak naprawdę przeznaczone tylko do przypadków, w których z jakiegoś powodu nie możesz (jeszcze) pozbyć się niektórych wbudowanych skryptów lub stylów z określonego dokumentu (ale powinieneś to usunąć później). Więc jeśli z jakiegoś powodu utkniesz w potrzebie zachowania wbudowanego skryptu i stylu, w międzyczasie możesz przynajmniej użyć mechanizmu nonce, aby pozwolić przeglądarkom sprawdzić, czy są w porządku. W przeciwnym razie powinieneś po prostu w pełni używać CSP zgodnie z przeznaczeniem i nie zezwalać na żadne wbudowane skrypty ani elementy stylu
sideshowbarker
2
@sideshowbarker, Co robi pusty nonce? Widzę strony z <script type="text/javascript" nonce>i<style type="text/css" nonce>
Pacerier
7
Uwaga: jeśli Twój skrypt jest statyczny, zalecam skrót CSP zamiast wartości jednorazowej.
Brian