Apa tujuan dari atribut “nonce” HTML untuk elemen skrip dan gaya?

141

W3C mengatakan ada atribut baru di HTML5.1 disebut nonceuntuk styledan scriptyang dapat digunakan oleh Content Kebijakan Keamanan dari sebuah situs web.

Saya mencari di Google tetapi akhirnya tidak mengerti apa yang sebenarnya dilakukan atribut ini dan apa yang berubah saat menggunakannya?

ata
sumber
2
Sepertinya itu hanya sedikit tambahan keamanan untuk situs Anda, Anda menambahkannya ke tautan atau formulir dan ketika halaman disajikan, jika nonce tidak cocok dengan Anda, maka Anda tidak melayani halaman
Pete
@ Pete Maksud Anda maka tidak ada yang bisa memuat Anda scriptdan style? Sesuatu seperti larangan hotlink?
ata
itu juga untuk halaman normal dan validasi formulir
Pete

Jawaban:

196

The nonceatribut memungkinkan Anda untuk “daftar putih” inline tertentu scriptdan styleelemen, sambil menghindari penggunaan CSP unsafe-inlinedirektif (yang akan memungkinkan semua inline script/ style), sehingga Anda masih mempertahankan fitur CSP kunci melarang inline script/ stylepada umumnya.

Jadi nonceatributnya adalah cara memberitahu browser bahwa konten inline dari skrip atau elemen gaya tertentu tidak disuntikkan ke dalam dokumen oleh beberapa pihak ketiga (jahat), tetapi dimasukkan ke dalam dokumen dengan sengaja oleh siapa pun yang mengendalikan server, dokumen tersebut dilayani dari.

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it memberikan contoh yang baik tentang bagaimana menggunakan nonceatribut, yang sama dengan langkah-langkah berikut:

  1. Untuk setiap permintaan yang diterima server Web Anda untuk dokumen tertentu, minta backend Anda membuat string acak yang dikodekan base64 setidaknya 128 bit data dari generator nomor acak yang aman secara kriptografis; misalnya EDNnf03nceIOfn39fn3e9h3sdfa,. Itu kekuranganmu.

  2. Ambil nonce yang dihasilkan pada langkah 1, dan untuk inline script/ styleAnda ingin "daftar putih", buat kode backend Anda memasukkan nonceatribut ke dalam dokumen sebelum dikirim melalui kabel, dengan nilai itu sebagai nilainya:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. Ambil nonce yang dihasilkan di langkah 1, tambahkan nonce-dulu, dan buat backend Anda menghasilkan header CSP dengan nilai di antara daftar sumber untuk script-srcatau style-src:

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

Jadi mekanisme menggunakan nonce adalah alternatif untuk bukannya membuat backend Anda menghasilkan hash dari konten inline scriptatau styleAnda ingin mengizinkan, dan kemudian menentukan hash di daftar sumber yang sesuai di header CSP Anda.

Perhatikan bahwa karena browser tidak (tidak dapat) memeriksa bahwa nilai nonce mengirim perubahan antara permintaan halaman, itu mungkin — meskipun sama sekali tidak disarankan — untuk melewati 1 di atas dan tidak membuat backend Anda melakukan apa pun secara dinamis untuk nonce, dalam hal ini Anda bisa saja meletakkan nonceatribut dengan nilai statis ke dalam sumber HTML dokumen Anda, dan mengirim header CSP statis dengan nilai nonce yang sama.

Tetapi alasan mengapa Anda tidak ingin menggunakan bilangan statis dengan cara itu adalah, itu akan cukup mengalahkan seluruh tujuan penggunaan bilangan bulat itu sama sekali — karena, jika Anda menggunakan bilah statis seperti itu, pada titik itu Anda mungkin hanya menggunakan unsafe-inline.

sontonbarker
sumber
17
Ini bukan untuk memverifikasi pengguna — ini untuk memverifikasi bahwa konten inline dari skrip atau elemen gaya tertentu tidak disuntikkan ke dalam dokumen saya beberapa pihak ketiga (jahat), tetapi dimasukkan ke dalam dokumen dengan sengaja oleh siapa pun yang mengendalikan server dokumen. dilayani dari. (Saya akan memperbarui jawaban saya untuk mengatakan itu.)
sontonbarker
3
Nonces tidak perlu disimpan — alih-alih dihasilkan dalam memori dan dimasukkan ke dalam header CSP dan dokumen HTML yang dikirim melalui kawat sebagai tanggapan (bukan ke sumber yang disimpan di sistem file / database server).
sontonbarker
3
Sejauh alasan untuk berupaya menggunakan nonceatribut, jika Anda tidak benar-benar perlu menggunakannya, maka jangan. Ini benar-benar hanya dimaksudkan untuk kasus-kasus di mana karena alasan tertentu Anda tidak dapat (belum) menyingkirkan beberapa skrip inline atau konten gaya dari dokumen tertentu (tetapi harus menghapusnya nanti). Jadi jika beberapa alasan Anda merasa perlu menyimpan skrip inline dan konten gaya, maka saat itu Anda setidaknya dapat menggunakan mekanisme nonce untuk membiarkan browser memverifikasi bahwa mereka OK. Kalau tidak, Anda harus menggunakan CSP sepenuhnya seperti yang dimaksudkan, & tidak mengizinkan skrip inline atau elemen gaya
sontonbarker
2
@sontonbarker, Apa yang dilakukan oleh sebuah tempat kosong? Saya melihat halaman dengan <script type="text/javascript" nonce>dan<style type="text/css" nonce>
Pacerier
7
Catatan: Jika skrip Anda statis, saya sarankan hash CSP, daripada nonce.
Brian