Pengantar CSRF
CSRF (Pemalsuan Permintaan Lintas Situs), Nama Cina: Pemalsuan Permintaan Lintas Situs, juga dikenal sebagai: One Click Attack/Sesi Riding, Singkatan: CSRF/XSRF.
Untuk perkenalan spesifik dan metode serangan SCRF, silakan merujuk pada pengenalan ensiklopedia Baidu dan analisis seorang pria besar:
Ensiklopedia CSRF Baidu secara singkat membahas metode serangan CSRF
Langkah Konfigurasi
1. Bergantung pada paket JAR
<Properties> <spring.security.version> 4.2.2.release </spring.security.version> </properties> <dependency> <groupid> org.springframework.security </groupId> <ArTifactId> Spring-Security-core </artifactid </versi </versi) </versi </artifactid </artfactid </artfactid </artfactid </artfactid </artfactid </core </artfactid </artfactid </core </artfactid <groupId> org.springframework.security </sroupid> <t ArtifactId> spring-security-web </arttifactid> <version> $ {spring.security.version} </version> </dependency> <sgroupid> <croxcury-conf-conf. <version> $ {spring.security.version} </version> </dependency> 2.Web.xml Konfigurasi
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. Konfigurasi File Konfigurasi Musim Semi
<bean id = "csrfSecurityRequestMatcher"> </tactp: http auto-config = "true" use-expressions = "true"> <Security: header> <keamanan: rangka-ref-ref-ref-ref-ref = "/> </headers> <keamanan: csrf-ref-ref-ref ="/> </security: header> <Security: csrf-ref-ref-refer = "> </Security: header> Security: CSRF-REFATCHERCATCE =" CHEOMEREURY = Security: Security: CSRFCATCH-REFATCHER; </keamanan: http>
4. Kustomisasi kelas implementasi permintaan CSRFSecurityRequestMatcher
Kelas ini digunakan untuk menyesuaikan permintaan mana yang tidak memerlukan intersepsi dan penyaringan. Jika CSRF dikonfigurasi, semua permintaan HTTP dicegat oleh CSRFFILTER, dan ada kelas pribadi defaultrequirescsrfmatcher di csrffilter.
Kode Sumber 1: Kelas DefaultrequirescsrfMatcher
Private Static Final Class DEFAULTREQUIRESCSRFMATCHER mengimplementasikan RequestMatcher {private final hashset <string> diizinkanmethods; private defaultrequirescsrfMatcher () {this.allowedMethods = new HashSet (arrays.aslist (string baru [] {"get", "head", "trace", "options"})); } Public Boolean Matches (permintaan httpservletRequest) {return! this.allowedMethods.contains (request.getMethod ()); }} Dari kode sumber ini, kita dapat menemukan bahwa metode posting dikecualikan, yaitu, hanya empat jenis metode seperti Get | head | Trace | opsi yang akan dirilis. Permintaan HTTP dari metode lain harus memverifikasi apakah token _csrf benar. Biasanya, saat memanggil layanan antarmuka REST dalam metode POST, tidak ada token _CSRF, yang akan menyebabkan antarmuka istirahat kita gagal. Kita perlu menyesuaikan kelas untuk melepaskan antarmuka jenis ini. Mari kita lihat filter khusus kami:
Kode Sumber 2: Kelas CSRFSecurityRequestMatcher
kelas publik csrfsecurityRequestMatcher mengimplementasikan requestMatcher {private Pattern diizinkan methods = pola.compile ("^(get | head | trace | opsi) $"); Private RegexRequestMatcher UnrotectedMatcher = RegexRequestMatcher baru ("^/istirahat /.*", null); @Override Public Boolean Matches (permintaan httpservletRequest) {if (diizinkanmethods.matcher (request.getMethod ()). Matches ()) {return false; } return! UncrotectedMatcher.matches (permintaan); }} Catatan: Secara umum, layanan antarmuka lainnya yang kami definisikan semuanya dengan /istirahat /, jadi jika proyek Anda tidak digunakan, atau tidak ada layanan istirahat dalam proyek, kelas ini dapat sepenuhnya dihilangkan.
5. Konfigurasi Permintaan Pos
Secara umum, ada file JSP umum dalam proyek kami, yang dirujuk oleh setiap halaman, sehingga kami dapat membuat konfigurasi berikut dalam file umum:
<meta name = "_ csrf" content = "$ {_ csrf.token}"/> <meta name = "_ csrf_header" content = "$ {_ csrf.HeaderName}"/> <script> var token = $ ("meta [nama = '_ csrf']"). var header = $ ("meta [name = '_ csrf_header']"). attr ("content"); $ .AjaxSetup ({beforeSend: function (xhr) {if (header && token) {xhr.setRequestHeader (header, token);}}}); </script> $ .AjaxSetup berarti menambahkan header dan token ini ke semua permintaan kami, atau memasukkannya ke dalam formulir. Perhatikan bahwa _csrf harus cocok dengan konfigurasi dalam file konfigurasi keamanan musim semi, dan standarnya _csrf.
Analisis Kode Sumber
Kita tahu bahwa karena CSRF dikonfigurasi, semua permintaan HTTP akan dicegat oleh Csrffilter, jadi setelah melihat kode sumber Csrffilter, Anda akan jelas tentang prinsipnya sekilas. Di sini kita hanya melihat metode penyaringan spesifik:
Kode Sumber 3: Metode Dofilterinternal Csrffilter
void dofilterinternal yang dilindungi (permintaan httpservletRequest, respons httpservletResponse, filterchain filterChain) melempar servletException, ioException {request.setAttribute (httpservletResponse.class.getName (), respons); Csrftoken csrftoken = this.tokenrepository.loadToken (permintaan); boolean hilangtoken = csrftoken == null; if (missestoken) {// Jika token kosong, itu berarti bahwa pertama kali Anda mengaksesnya, menghasilkan objek token csrftoken = this.tokenRepository.generateToken (permintaan); this.tokenRepository.Savetoken (csrftoken, permintaan, respons); } request.setAttribute (csrftoken.class.getName (), csrftoken); // Masukkan objek token ke dalam permintaan, perhatikan bahwa kunci di sini adalah csrftoken.getParametername () = _csrf, jadi kami menulisnya sampai mati di halaman. request.setAttribute (csrftoken.getParametername (), csrftoken); // Mesin ini adalah filter yang kami sesuaikan dalam file konfigurasi pegas, yaitu, dapatkan, head, jejak, opsi dan istirahat kami tidak menangani jika (! This.requirecsrfprotectionMatcher.matches (request)) {filterchain.dofilter (permintaan, respons); } else {string actactionToken = request.getHeader (csrftoken.getHeaderName ()); if (actactionToken == null) {actionToken = request.getParameter (csrftoken.getParametername ()); } if (! csrftoken.getToken (). Equals (AcctualToken)) {if (this.logger.isdebugeNabled ()) {this.logger.debug ("token csrf tidak valid yang ditemukan untuk" + urlutils.buildfullrequesturl (permintaan)); } if (MissingToken) {this.accessdeniedhandler.handle (permintaan, respons, baru hilangcsrftokenException (aktualtoken)); } else {this.accessdeniedhandler.handle (permintaan, respons, new InvalidCsrftokenException (csrftoken, aktualtoken)); }} else {filterchain.dofilter (request, response); }}}Seperti yang dapat dilihat dari kode sumber, permintaan pasca selain dari filter khusus kami memerlukan verifikasi token.
Awalnya, saya ingin mengambil tangkapan layar untuk mendapatkan casing, dan kemudian menggunakan breakpoint untuk melihat status transmisi nilai halaman dan latar belakang ... Namun, saya tidak dapat mengunggah gambar di sini dan menjadi gila. Oke, sangat banyak untuk diringkas! Jika Anda memiliki tulisan yang salah atau memiliki pertanyaan lain, Anda dapat meninggalkan pesan untuk berkomunikasi.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.