Pemikiran dan amalan pemisahan bahagian hadapan dan belakang berdasarkan NodeJS (4) Penyelesaian kepada isu keselamatan_node.js

WBOY
Lepaskan: 2016-05-16 16:35:20
asal
1705 orang telah melayarinya

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:

Salin kod Kod adalah seperti 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:

Salin kod Kod adalah seperti berikut:

<script>alert('hello')'</script>

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

Salin kod Kod adalah seperti berikut:

<script>alert("hello!")</script>

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:

Salin kod Kod adalah seperti berikut:


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

Salin kod Kod adalah seperti berikut:

var Security= require('midway-security');
//data dari pelayan,cth {html:'',lain:""}
data.html =Security.escapeHtml(data.html);
xtpl = xtpl.render(data);

Kaedah 2: HTML melarikan data HTML dalam templat

Salin kod Kod adalah seperti berikut:


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:

Salin kod Kod adalah seperti berikut:


{{{mesej}}}

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 :

Salin kod Kod adalah seperti berikut:

http://eval.com/eval.js"> style="color:red;font-size:20px;position:fixed ;">Saya tinggalkan mesej

Jika data teks kaya di atas dikeluarkan terus ke halaman, ia pasti akan menyebabkan js tapak eval.com disuntik ke dalam halaman semasa, menyebabkan serangan XSS. Untuk mengelakkan kerentanan ini, kami hanya perlu memanggil kaedah Security.richText dalam templat atau program untuk memproses teks kaya yang dimasukkan oleh pengguna.

Kaedah panggilan adalah serupa dengan escapeHtml, terdapat dua cara seperti berikut

Kaedah 1: Panggil terus dalam program Node.js

Salin kod Kod adalah seperti berikut:

mesej =Security.richText(message);
var html = xtpl.render(message)

Kaedah 2: Panggil

dalam templat

Salin kod Kod adalah seperti berikut:


Security.richText({{{message}}})

Selepas memanggil kaedah richText Security, output akhir adalah seperti berikut:

Salin kod Kod adalah seperti berikut:


Saya meninggalkan mesej

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/

Secara nyata, kaedah menghantar halaman 404 adalah seperti berikut

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.

Pada masa hadapan, mekanisme keselamatan untuk pengendalian ralat akan dilengkapkan pada peringkat rangka kerja Midway.

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

Salin kod Kod adalah seperti berikut:
var jsonText ="{"
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan