Menggunakan Slash Character di Spring Spring

1. Pengenalan

Semasa kami mengembangkan perkhidmatan web, kami mungkin perlu menangani jalan URL yang rumit atau tidak dijangka yang boleh mengandungi garis miring . Akibatnya, kami mungkin menghadapi masalah dengan pelayan web atau kerangka kerja yang kami gunakan.

Musim bunga secara khusus boleh menjadi agak rumit dalam hal ini kerana konfigurasi lalai yang disediakannya.

Dalam tutorial ini, kami akan menunjukkan beberapa penyelesaian dan cadangan umum untuk menangani URL dengan garis miring pada musim bunga . Kami juga akan melihat mengapa kami tidak boleh menggunakan beberapa peretasan biasa untuk menyelesaikan masalah ini. Teruskan membaca untuk mengetahui lebih lanjut mengenainya!

2. Selesaikan Permintaan Secara Manual

Dalam perkhidmatan web kami, kadang-kadang kita perlu memetakan semua permintaan di bawah jalan tertentu ke titik akhir yang sama. Untuk memburukkan lagi keadaan, kita mungkin tidak tahu bagaimana rupa jalan yang selebihnya. Kita mungkin juga perlu menerima jalan ini sebagai parameter untuk menggunakannya sesudahnya.

Katakanlah bahawa kita dapat menerima permintaan dengan mana-mana jalan di bawah / mypaths :

//localhost:8080/mypaths/any/custom/path

Dan andaikan kita mahu menyimpan semua jalan yang berbeza ini dalam pangkalan data untuk mengetahui permintaan apa yang kita terima.

Penyelesaian pertama yang mungkin akan terlintas di fikiran kita ialah menangkap bahagian jalan yang dinamik menjadi PathVariable :

@GetMapping("mypaths/{anything}") public String pathVariable(@PathVariable("anything") String anything) { return anything; }

Malangnya, kami segera mengetahui bahawa ini mengembalikan 404 jika PathVariable mengandungi garis miring . Watak slash adalah pembatas jalan standard URI, dan semua yang berlaku selepas itu dikira sebagai tahap baru dalam hierarki jalan. Seperti yang dijangkakan, Spring mengikuti standard ini.

Kami dapat menyelesaikannya dengan mudah dengan membuat cadangan untuk semua permintaan di bawah jalan tertentu dengan menggunakan ** wildcard :

@GetMapping("all/**") public String allDirectories(HttpServletRequest request) { return request.getRequestURI() .split(request.getContextPath() + "/all/")[1]; }

Kemudian kita harus menguraikan sendiri URI untuk mendapatkan bahagian jalan yang kita minati.

Penyelesaian ini sangat sesuai ketika bekerja dengan parameter seperti URL , tetapi seperti yang akan kita lihat di bahagian seterusnya, tidak cukup untuk beberapa kes lain.

3. Gunakan Parameter Pertanyaan

Berbeza dengan contoh sebelumnya, ada kes lain di mana kita tidak hanya memetakan jalan yang berbeda tetapi menerima String apa pun sebagai parameter dalam URL.

Mari kita bayangkan bahawa dalam contoh sebelumnya, kami membuat permintaan dengan parameter jalur yang mengandungi garis miring berturut-turut :

//localhost:8080/all///myurl.com

Pada mulanya, kami dapat berfikir bahawa ini mesti berfungsi, tetapi kami segera menyedari bahawa pengawal kami mengembalikan http: /myurl.com. Ini berlaku kerana Spring Security menormalkan URL dan menggantikan setiap garis miring dua dengan satu .

Spring juga menormalkan urutan lain dalam URL, seperti lintasan lintasan. Ia memerlukan langkah berjaga-jaga ini untuk mengelakkan URL jahat memintas batasan keselamatan yang ditentukan , seperti yang dijelaskan dalam dokumentasi Spring Security rasmi.

Dalam kes ini, sangat disarankan untuk menggunakan parameter pertanyaan:

@GetMapping("all") public String queryParameter(@RequestParam("param") String param) { return param; }

Dengan cara ini, kami dapat menerima parameter String tanpa sekatan keselamatan ini, dan perkhidmatan web kami akan lebih mantap dan selamat.

4. Elakkan Penyelesaian Masalah

Penyelesaian yang kami kemukakan mungkin menyiratkan beberapa perubahan dalam reka bentuk pemetaan kami. Ini boleh menggoda kita untuk menggunakan beberapa penyelesaian biasa untuk menjadikan titik akhir asal kita berfungsi semasa menerima garis miring di URL.

Penyelesaian yang paling biasa adalah untuk mengekod garis miring dalam parameter jalan. Walau bagaimanapun, beberapa kelemahan keselamatan dilaporkan pada masa lalu dan kebanyakan pelayan web dan aplikasi bertindak balas terhadapnya dengan tidak membenarkan slash yang dikodkan secara lalai . Masih mungkin untuk mengubah tingkah laku ini hanya dengan mengubah tetapan yang sesuai, seperti di Tomcat.

Yang lain seperti Apache Server melangkah lebih jauh dan memperkenalkan pilihan untuk membenarkan slash yang dikodkan tanpa menyahkodnya sehingga tidak ditafsirkan sebagai pembatas jalan. Bagaimanapun, ini tidak digalakkan dan boleh menimbulkan risiko keselamatan yang berpotensi.

Sebaliknya, kerangka web juga mengambil langkah berjaga-jaga. Seperti yang telah kita lihat sebelumnya, Spring menambahkan beberapa mekanisme sebagai perlindungan terhadap bekas servlet yang kurang ketat . Oleh itu, sekiranya kita membenarkan slash yang dikodkan di pelayan kita, kita masih harus membenarkannya di Spring

Akhirnya, ada jenis penyelesaian lain seperti mengubah normalisasi URI yang disediakan oleh Spring secara lalai. Seperti sebelumnya, kita harus sangat berhati-hati jika kita mengubah lalai ini.

5. Kesimpulan

Dalam artikel pendek ini, kami telah menunjukkan beberapa penyelesaian untuk menangani garis miring di URL pada musim bunga. Kami juga telah memperkenalkan beberapa masalah keselamatan yang boleh timbul jika kami mengubah konfigurasi pelayan atau kerangka kerja lalai seperti Spring.

Sebagai peraturan, parameter pertanyaan biasanya merupakan penyelesaian terbaik untuk mengatasi garis miring di URL.

Seperti biasa, kod sumber penuh untuk contoh boleh didapati di GitHub.