Apakah perlu menggunakan Perlindungan CSRF ketika aplikasi mengandalkan otentikasi tanpa kewarganegaraan (menggunakan sesuatu seperti HMAC)?
Contoh:
Kami punya app halaman (jika tidak kita harus menambahkan tanda pada setiap link:
<a href="...?token=xyz">...</a>
.Pengguna mengautentikasi dirinya sendiri menggunakan
POST /auth
. Jika otentikasi berhasil, server akan mengembalikan beberapa token.Token akan disimpan melalui JavaScript di beberapa variabel di dalam aplikasi halaman tunggal.
Token ini akan digunakan untuk mengakses URL terbatas seperti
/admin
.Token akan selalu dikirim di dalam HTTP Headers.
TIDAK ADA Sesi Http, dan NO Cookies.
Sejauh yang saya mengerti, seharusnya (?!) tidak ada kemungkinan untuk menggunakan serangan lintas situs, karena browser tidak akan menyimpan token, dan karenanya tidak dapat secara otomatis mengirimkannya ke server (itulah yang akan terjadi saat menggunakan Cookies / Sidang).
Apakah saya melewatkan sesuatu?
Jawaban:
Saya menemukan beberapa informasi tentang CSRF + tidak menggunakan cookie untuk otentikasi:
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
"karena Anda tidak mengandalkan cookie, Anda tidak perlu melindungi dari permintaan lintas situs"
http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
"Jika kami menggunakan cookie, Anda benar-benar perlu melakukan CSRF untuk menghindari permintaan lintas situs. Itu adalah sesuatu yang kami bisa lupakan saat menggunakan JWT seperti yang akan Anda lihat. "
(JWT = Json Web Token, otentikasi berbasis Token untuk aplikasi stateless)
http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services
"Cara termudah untuk melakukan otentikasi tanpa risiko kerentanan CSRF adalah dengan menghindari penggunaan cookie untuk mengidentifikasi pengguna "
http://sitr.us/2011/08/26/cookies-are-bad-for-you.html
"Masalah terbesar dengan CSRF adalah bahwa cookie sama sekali tidak memberikan pertahanan terhadap jenis serangan ini. Jika Anda menggunakan otentikasi cookie Anda juga harus menerapkan tindakan tambahan untuk melindungi terhadap CSRF. Tindakan pencegahan paling dasar yang dapat Anda lakukan adalah memastikan bahwa aplikasi Anda tidak pernah melakukan efek samping sebagai respons terhadap permintaan GET. "
Ada lebih banyak halaman, yang menyatakan bahwa Anda tidak memerlukan perlindungan CSRF, jika Anda tidak menggunakan cookie untuk otentikasi. Tentu saja Anda masih dapat menggunakan cookie untuk yang lainnya, tetapi hindari menyimpan apa pun seperti
session_id
di dalamnya.Jika Anda perlu mengingat pengguna, ada 2 opsi:
localStorage
: Penyimpanan nilai kunci dalam browser. Data yang disimpan akan tersedia bahkan setelah pengguna menutup jendela browser. Data tersebut tidak dapat diakses oleh situs web lain, karena setiap situs mendapatkan penyimpanannya sendiri.sessionStorage
: Juga penyimpanan data di browser. Perbedaannya adalah: Data dihapus saat pengguna menutup jendela browser. Tapi itu tetap berguna, jika aplikasi web Anda terdiri dari banyak halaman. Jadi, Anda dapat melakukan hal berikut:sessionStorage
sessionStorage
sessionStorage
atau menunggu pengguna menutup jendela browser, yang akan menghapus semua data yang disimpan.(untuk keduanya, lihat di sini: http://www.w3schools.com/html/html5_webstorage.asp )
Apakah ada standar resmi untuk token auth?
JWT (Json Web Token): Menurut saya ini masih berupa draf, tetapi sudah digunakan oleh banyak orang dan konsepnya terlihat sederhana dan aman. (IETF: http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-25 )
Ada juga perpustakaan untuk banyak kerangka kerja yang tersedia. Hanya google untuk itu!
sumber
http://.../someRestResource?method=POST
. Jadi pada dasarnya ini adalahGET
permintaan, tetapi Aplikasi Server menafsirkannya sebagaiPOST
permintaan, karena telah dikonfigurasi untuk menggunakanmethod
parameter, bukan header HTTP....
Mengenai browser web umum, mereka memberlakukan Kebijakan Asal-Sama dan hanya akan menjalankanGET
permintaan ke server asing. Meskipun bisa mungkin untuk mengeksekusiPOST
permintaan jika web browser tidak berlaku standar-standar web (bug, malware).Server Side App
: Mengirim Badan Permintaan masih belum dapat dilakukan, karena browser umum tidak mengizinkannya. Namun, jika Aplikasi Server memungkinkanmethod=POST
, itu mungkin juga memungkinkanbody={someJson}
untuk mengganti isi permintaan default. Itu desain API yang sangat buruk dan sangat berisiko. Meskipun jika Aplikasi Serverhttp://...?method=POST&body={someJson}
Anda memungkinkan Anda harus benar-benar memikirkan secara berlebihan apa yang Anda lakukan di sana dan mengapa dan jika itu perlu sama sekali. (Saya akan mengatakan dalam 99,9999% kasus itu tidak perlu). Selain itu, browser hanya dapat mengirim beberapa kilobyte dengan cara ini.TL; DR
JWT, jika digunakan tanpa Cookies, meniadakan kebutuhan token CSRF - TAPI! dengan menyimpan JWT di session / localStorage, Anda mengekspos JWT Anda dan identitas pengguna jika situs Anda memiliki kerentanan XSS (cukup umum). Lebih baik menambahkan
csrfToken
kunci ke JWT dan menyimpan JWT dalam cookie dengansecure
danhttp-only
atribut set.Baca artikel ini dengan deskripsi yang bagus untuk info lebih lanjut https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage
Jadi, Anda perlu menyimpan csrfToken di localStorage / sessionStorage serta di JWT itu sendiri (yang disimpan dalam cookie khusus http dan aman). Kemudian untuk perlindungan csrf, verifikasi bahwa token csrf di JWT cocok dengan header csrf-token yang dikirimkan.
sumber