Kata Pengantar
Dalam model pembangunan pemisahan bahagian hadapan dan belakang, salah satu perubahan yang paling jelas dari segi peranan dan fungsi pembangunan ialah: pada masa lalu, pelajar bahagian hadapan yang hanya bertanggungjawab untuk pembangunan dalam persekitaran penyemak imbas diperlukan untuk mencuba tahap pelayan. Soalan asas yang kita hadapi ialah bagaimana untuk memastikan keselamatan Web?
Artikel ini, di bawah seni bina mod pemisahan bahagian hadapan dan belakang, mencadangkan penyelesaian kepada masalah keselamatan yang dihadapi oleh bahagian hadapan dalam pembangunan Web, serta tindakan balas dan langkah berjaga-jaga.
Pertahanan terhadap serangan skrip merentas tapak (XSS)
Masalah dan penyelesaian
Serangan skrip merentas tapak (XSS, skrip silang tapak) ialah kaedah paling biasa dan asas untuk menyerang tapak web. Penyerang boleh menerbitkan data yang mengandungi kod yang menyinggung perasaan pada halaman web dan apabila penonton melihat halaman web, skrip tertentu akan dilaksanakan dengan identiti dan kebenaran pengguna penonton. XSS boleh mengubah suai data pengguna dengan mudah, mencuri maklumat pengguna dan menyebabkan jenis serangan lain, seperti serangan CSRF.
Kaedah asas untuk menghalang serangan XSS adalah untuk memastikan bahawa sebarang output data ke halaman HTML terlepas dalam HTML (HTML escape). Contohnya, kod templat berikut:
$deskripsi dalam kod ini ialah pembolehubah templat (sintaks pembolehubah yang ditakrifkan dalam templat berbeza adalah berbeza, ini hanyalah ilustrasi), data yang diserahkan oleh pengguna, kemudian penyerang boleh memasukkan sekeping kod yang mengandungi "JavaScript ", supaya Hasil daripada pernyataan templat di atas menjadi hasil berikut:
Kod di atas, apabila dipaparkan dalam penyemak imbas, akan melaksanakan kod JavaScript dan memaklumkan helo pada skrin. Sudah tentu, kod ini tidak berbahaya, tetapi penyerang boleh mencipta JavaScript untuk mengubah suai maklumat pengguna atau mencuri data kuki.
Penyelesaian adalah sangat mudah, iaitu html melarikan nilai $description Kod keluaran yang dilepaskan adalah seperti berikut
Kod HTML yang dilepaskan di atas tidak berbahaya.
Penyelesaian Midway
Escape semua data output pengguna dalam halaman
Terdapat beberapa situasi dan kaedah untuk melepaskan data:
1 Gunakan mekanisme yang disediakan di dalam templat untuk melarikan diri
Midway menggunakan KISSY xtemplate secara dalaman sebagai bahasa templat.
Dalam pelaksanaan xtemplate, dua kurungan segi empat sama ({{val}}) digunakan untuk menghuraikan data templat secara tatabahasa Secara lalai, data adalah HTML yang dilepaskan, jadi pembangun boleh menulis templat seperti ini:
Dalam xtemplate, jika anda tidak mahu data output terlepas, anda perlu menggunakan tiga kurungan segi empat sama ({{{val}}}).
2. Panggil secara eksplisit fungsi melarikan diri dalam Midway
Pembangun boleh menghubungi terus kaedah melarikan diri HTML yang disediakan oleh Midway dalam program atau templat Node.js untuk melarikan data secara eksplisit, seperti berikut:
Kaedah 1: Data melarikan diri HTML dalam program Node.js
Kaedah 2: HTML melarikan data HTML dalam templat
Nota: Gunakan Security.escapeHtml untuk melarikan diri hanya apabila data tidak terlepas di dalam templat. Jika tidak, dua escape akan ditindih di dalam templat dan dalam program, menghasilkan output yang tidak dijangka.
Cadangan: Jika anda menggunakan xtemplate, adalah disyorkan untuk terus menggunakan templat terbina dalam {{}} untuk melarikan diri jika anda menggunakan templat lain, adalah disyorkan untuk menggunakan Security.escapeHtml untuk melarikan diri.
Tapis output teks kaya oleh pengguna dalam halaman
Anda mungkin berfikir: “Sebenarnya, saya hanya mahu mengeluarkan teks kaya Contohnya, sesetengah papan mesej dan forum menyediakan pengguna dengan beberapa saiz fon, warna, latar belakang dan fungsi lain yang mudah untuk mencegah XSS? "
1. Gunakan fungsi richText yang disediakan oleh Security di Midway
Midway menyediakan kaedah richText, yang digunakan khas untuk menapis teks kaya dan mencegah kelemahan seperti XSS, pancingan data dan kecurian kuki.
Terdapat papan mesej, kod templat mungkin seperti berikut:
Oleh kerana mesej ialah data input pengguna, dan kandungan papan mesej mengandungi maklumat teks yang kaya, jadi di sini dalam xtemplate, tiga kurungan kerinting digunakan, dan pelarian HTML tidak dilakukan secara lalai, maka input data oleh pengguna adalah seperti berikut :
Kaedah panggilan adalah serupa dengan escapeHtml, terdapat dua cara seperti berikut
Kaedah 1: Panggil terus dalam program Node.js
Kaedah 2: Panggil
dalam templatSelepas memanggil kaedah richText Security, output akhir adalah seperti berikut:
Pertama sekali dapat dilihat: teg skrip yang boleh menyebabkan serangan XSS ditapis secara langsung pada masa yang sama, posisi atribut CSS: tetap dalam teg gaya juga ditapis; Akhirnya keluarkan teks kaya HTML yang tidak berbahaya
Ketahui tentang kemungkinan jalan lain untuk serangan XSS
Selain kemungkinan serangan XSS dalam templat halaman, terdapat beberapa cara lain di mana aplikasi web mungkin berisiko.
1. Ralat kelemahan halaman
Jika halaman tidak ditemui, sistem mungkin melaporkan ralat 404 Not Found, contohnya: http://localhost/page/not/found
404 Tidak Ditemui
Halaman /page/not/found tidak keluar
Jelas sekali: penyerang boleh menggunakan halaman ini untuk membina sambungan seperti ini, http://localhost/
res.send(404,'Maaf, kami tidak menemuinya!')
Di sini pembangun perlu memberi perhatian kepada cara halaman ralat (404 atau status ralat lain) dikendalikan. Jika kandungan pulangan mesej ralat mengandungi maklumat laluan (sebenarnya, lebih tepat, ia adalah maklumat input pengguna), anda mesti melakukan escapeHtml.
Penjelasan tambahan tentang penyelesaian Midway
Enjin templat lain
Midway menyokong templat xtemplate secara lalai, tetapi mungkin juga menyokong templat lain pada masa hadapan: seperti jed, misai, ejs, dsb. Pada masa ini, templat arus perdana menyediakan kaedah penulisan pembolehubah keluaran lalai dan tidak lari, dan pembangun perlu memberi perhatian khusus kepada keselamatan mereka.
Sokongan lain untuk melarikan diri
Selain data biasa dan output data teks kaya dalam halaman, beberapa senario juga termasuk situasi lain yang mungkin memerlukan pelarian Midway menyediakan kaedah pelarian biasa berikut untuk digunakan oleh pembangun:escapeHtml menapis aksara dalam HTML tertentu untuk mengelakkan kelemahan XSS
jsEncode melakukan pelarian JavaScript pada Rentetan input dan melakukan pelarian unikod pada bahasa Cina, termasuk petikan tunggal dan petikan berganda
escapeJson ialah fungsi escape yang tidak memusnahkan struktur JSON dan hanya melaksanakan pemprosesan escapeHtml pada nama dan nilai dalam struktur json
escapeJsonForJsVar boleh difahami sebagai jsEncode escapeJson
Contohnya seperti berikut