Saya melihat episode Railscast ini dan bertanya-tanya mengapa panggilan ke escape_javascript
diperlukan di sini:
$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");
Untuk apa escape_javascript
digunakan?
Menurut dokumen Rails :
escape_javascript (javascript)
Escape carrier return dan tanda kutip tunggal dan ganda untuk segmen JavaScript.
Tapi itu tidak berarti banyak bagiku.
Jawaban:
Karena Anda tidak ingin pengguna memposting JavaScript yang sebenarnya dijalankan oleh browser?
sumber
Lebih mudah dipahami jika Anda membagi kode menjadi dua bagian.
Bagian pertama
$("#reviews").append("<%= ... %>");
adalah javascript dengan erb. Ini berarti bahwa<%= ... %>
wasiat akan diganti dengan apa pun yang dikembalikan kode ruby di dalamnya. Hasil dari penggantian tersebut harus berupa javascript yang valid, jika tidak maka akan terjadi error saat klien mencoba untuk memprosesnya. Jadi itu hal pertama: Anda membutuhkan javascript yang valid .Hal lain yang perlu diperhatikan adalah bahwa apa pun yang dihasilkan ruby harus terkandung di dalam string javascript dengan tanda kutip ganda - perhatikan tanda kutip ganda di sekitar
<%= ... %>
. Artinya, javascript yang dihasilkan akan terlihat seperti ini:Sekarang mari kita periksa bagian ruby di dalam file
<%= ... %>
. Apa yangrender(:partial => @review)
dilakukannya? Ini merender sebagian - yang berarti dapat merender segala jenis kode - html, css ... atau bahkan lebih banyak javascript!Jadi, apa yang terjadi jika parsial kita berisi beberapa html sederhana, seperti ini?
Ingat bahwa javascript Anda menggunakan string kutip ganda sebagai parameter? Jika kita hanya mengganti
<%= ... %>
dengan kode parsial itu, maka kita punya masalah - segera setelahhref=
ada tanda kutip ganda! Javascript tidak akan valid:Agar ini tidak terjadi, Anda ingin keluar dari karakter khusus ini sehingga string Anda tidak dipotong - Anda memerlukan sesuatu yang menghasilkan ini sebagai gantinya:
Inilah yang
escape_javascript
dilakukannya. Ini memastikan bahwa string yang dikembalikan tidak akan "merusak" javascript. Jika Anda menggunakannya, Anda akan mendapatkan hasil yang diinginkan:Salam!
sumber
escape_for_javascript
, karena sering kali Anda keluar dari kode lain (html misalnya) sehingga tidak merusak javascript.escape_javascript()
sekarang memiliki metode yang lebih pendek: simpleyj()
(setidaknya di Rails 4).pengguna dapat memposting kode berbahaya (pengguna jahat) yang jika dibiarkan tidak lolos akan berpotensi dieksekusi, memungkinkan pengguna untuk mengontrol aplikasi Anda.
coba ini:
tidak terlalu akrab dengan sintaks rel, tetapi jika Anda tidak melarikan diri
variable
maka kotak peringatan akan muncul, dan saya rasa itu bukan perilaku yang dimaksudkan.sumber
Jika Anda melihat sumbernya di sini , itu akan jauh lebih jelas.
Fungsi ini menyelesaikan dua hal berikut:
Ini menggantikan karakter dalam string input dengan yang ditentukan di JS_ESCAPE_MAP
Tujuannya adalah untuk memastikan bahwa kode javascript diserialkan dengan benar tanpa mengganggu string luar tempat kode tersebut disematkan. Misalnya jika Anda memiliki string javascript dalam tanda kutip ganda maka semua tanda kutip di dalam untuk string literal harus dalam tanda kutip tunggal untuk menghindari kode rusak.
Saat Anda menggunakan escape_javascript, ini biasanya disematkan dalam string lain atau html yang ada secara dinamis. Anda perlu memastikan bahwa melakukan ini tidak akan membuat seluruh halaman Anda tidak dirender.
Beberapa aspek dari tanggapan ini ditunjukkan dalam tanggapan lain tetapi saya ingin menyatukan semua item termasuk perbedaan antara javascript escaping dan html escaping. Selain itu, beberapa tanggapan menunjukkan bahwa fungsi ini membantu menghindari injeksi skrip. Saya rasa bukan itu tujuan dari fungsi ini. Misalnya, dalam ulasan Anda jika ulasan Anda memiliki peringatan ('halo'), hanya menambahkannya ke node tidak akan mengaktifkan pop-up. Anda tidak menyematkannya dalam fungsi yang dipicu saat pemuatan halaman atau melalui beberapa peristiwa lain. Hanya memiliki peringatan ('hi there') sebagai bagian dari html Anda tidak berarti bahwa itu akan dijalankan sebagai javascript.
Yang mengatakan saya tidak menyangkal bahwa injeksi skrip tidak mungkin dilakukan. Tapi untuk menghindari itu Anda perlu mengambil langkah-langkah saat Anda mengambil data pengguna dan menyimpannya di database Anda. Fungsi dan contoh yang Anda berikan terkait dengan rendering informasi, yang telah disimpan.
Saya harap ini membantu dan menjawab pertanyaan Anda.
sumber