Saya mengeluarkan nilai dari database (tidak benar-benar terbuka untuk entri publik, tetapi terbuka untuk entri oleh pengguna di perusahaan - artinya, saya tidak khawatir tentang XSS ).
Saya mencoba menampilkan tag seperti ini:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
DESCRIPTION sebenarnya adalah nilai dari database yang kira-kira seperti ini:
Prelim Assess "Mini" Report
Saya sudah mencoba mengganti "dengan \", tetapi apa pun yang saya coba, Firefox terus memotong panggilan JavaScript saya setelah spasi setelah kata Menilai , dan itu menyebabkan segala macam masalah.
Saya harus mengabaikan jawaban yang jelas, tetapi untuk kehidupan saya, saya tidak bisa mengetahuinya.
Adakah yang mau menunjukkan kebodohan saya?
Berikut ini adalah seluruh halaman HTML (pada akhirnya akan menjadi halaman ASP.NET , tetapi untuk menyelesaikannya, saya mengambil semua yang lain kecuali kode masalah)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
sumber
onclick
lampiran acara Anda tidak mengganggu dan memindahkan semua informasi basis data Anda ke pulau data. Segala sesuatu akan menjadi lebih bersih dan Anda akan benar-benar mendapatkan semacam kesalahan sintaksis ketika string Anda lolos dengan salah.Jawaban:
Anda harus keluar dari string yang Anda tulis
DoEdit
untuk menghapus karakter tanda kutip ganda. Mereka menyebabkanonclick
atribut HTML ditutup sebelum waktunya.Menggunakan karakter pelarian JavaScript
\
,, tidak cukup dalam konteks HTML. Anda perlu mengganti penawaran ganda dengan representasi entitas XML yang tepat"
,.sumber
'mystring'.replace(/"/g, '"');
"
akan bekerja dalam kasus khusus ini, seperti yang disarankan sebelum saya, karena konteks HTML.Namun, jika Anda ingin kode JavaScript Anda untuk secara independen lolos untuk konteks apapun, Anda bisa memilih untuk encoding JavaScript asli:
'
menjadi\x27
"
menjadi\x22
Jadi klik Anda akan menjadi:
DoEdit('Preliminary Assessment \x22Mini\x22');
Ini akan berfungsi misalnya juga ketika meneruskan string JavaScript sebagai parameter ke metode JavaScript lain (
alert()
adalah metode pengujian yang mudah untuk ini).Saya merujuk Anda ke duplikat pertanyaan Stack Overflow, Bagaimana cara saya melepaskan string di dalam kode JavaScript di dalam handler onClick? .
sumber
"
kehendak, tentu saja, berhasil."
diperlukan dalam nilai input, yaitu,<input value="\x22quoted string\x22">
tidak akan berfungsi.onclick="..."
). Nilaivalue
atribut tidak sedang diproses dalam konteks JavaScript, hanya dalam konteks HTML.'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
Sebaiknya lakukan triknya.
sumber
Teman-teman, sudah ada
unescape
fungsi dalam JavaScript yang melakukan unescaping untuk\"
:sumber
Masalahnya adalah HTML tidak mengenali karakter pelarian. Anda bisa mengatasinya dengan menggunakan tanda kutip tunggal untuk atribut HTML dan tanda kutip ganda untuk klik tersebut.
sumber
Inilah yang saya lakukan pada dasarnya
str.replace(/[\""]/g, '\\"')
.sumber
Jika Anda merakit HTML di Java, Anda dapat menggunakan kelas utilitas yang bagus ini dari Apache commons-lang untuk melakukan semua pelarian dengan benar:
sumber
Saya telah melakukan sampel menggunakan jQuery
Dan ini berfungsi di Internet Explorer dan Firefox.
sumber
Anda dapat menyalin kedua fungsi tersebut (tercantum di bawah), dan menggunakannya untuk menghindari / menghapus semua kutipan dan karakter khusus. Anda tidak harus menggunakan jQuery atau perpustakaan lain untuk ini.
sumber
Silakan temukan di kode di bawah ini yang lolos dari tanda kutip tunggal sebagai bagian dari string yang dimasukkan menggunakan ekspresi reguler. Ini memvalidasi jika string yang dimasukkan pengguna dipisahkan dengan koma dan pada saat yang sama bahkan lolos dari setiap kutipan tunggal yang dimasukkan sebagai bagian dari string.
Untuk menghindari tanda kutip tunggal, cukup masukkan garis miring diikuti dengan tanda kutip tunggal seperti: \ ' sebagai bagian dari string. Saya menggunakan validator jQuery untuk contoh ini, dan Anda dapat menggunakan sesuai kenyamanan Anda.
Contoh String yang Valid:
'Halo'
'Halo Dunia'
'Halo Dunia'
'Halo Dunia',' '
'Ini duniaku', 'Tidak dapat menikmati ini tanpa aku.', 'Selamat datang, Pengunjung'
HTML:
JavaScript:
sumber
Melarikan diri dari ruang kosong juga. Bagi saya sepertinya Firefox mengasumsikan tiga argumen, bukan satu.
adalah karakter ruang yang tidak putus-putus. Bahkan jika itu bukan masalah keseluruhan, itu mungkin masih merupakan ide yang bagus.sumber
Anda harus menghindari tanda kutip dengan garis miring terbalik ganda.
Ini gagal (dihasilkan oleh json_encode PHP ):
Ini bekerja:
sumber
Anda dapat menggunakan metode jQuery escape () dan unescape (). Seperti di bawah ini,
Gunakan
escape(str);
untuk keluar dari string dan pulih kembali menggunakanunescape(str_esc);
.sumber