Saya menggunakan JavaScript untuk menarik nilai dari bidang tersembunyi dan menampilkannya di kotak teks. Nilai dalam bidang tersembunyi disandikan.
Sebagai contoh,
<input id='hiddenId' type='hidden' value='chalk & cheese' />
ditarik ke dalam
<input type='text' value='chalk & cheese' />
melalui beberapa jQuery untuk mendapatkan nilai dari bidang tersembunyi (pada titik inilah saya kehilangan penyandian):
$('#hiddenId').attr('value')
Masalahnya adalah bahwa ketika saya membaca chalk & cheese
dari bidang tersembunyi, JavaScript tampaknya kehilangan penyandian. Saya tidak ingin nilainya chalk & cheese
. Saya ingin yang harfiahamp;
dipertahankan.
Apakah ada pustaka JavaScript atau metode jQuery yang akan meng-enkode string?
chalk
dancheese
pernah digunakan bersama 0_oJawaban:
EDIT: Jawaban ini telah diposting lama, dan
htmlDecode
fungsinya memperkenalkan kerentanan XSS. Itu telah dimodifikasi mengubah elemen sementara daridiv
ketextarea
mengurangi peluang XSS. Tetapi saat ini, saya akan mendorong Anda untuk menggunakan API DOMParser seperti yang disarankan di penjawab lainnya .Saya menggunakan fungsi-fungsi ini:
Pada dasarnya elemen textarea dibuat dalam memori, tetapi tidak pernah ditambahkan ke dokumen.
Pada
htmlEncode
fungsi saya mengaturinnerText
elemen, dan mengambil yang disandikaninnerHTML
; padahtmlDecode
fungsi saya mengaturinnerHTML
nilai elemen daninnerText
diambil.Lihat contoh yang sedang berjalan di sini .
sumber
white-space
properti, yang menunjukkan bagaimana ruang dalam konten HTML seharusnya diproses. Kehadiran kelayakan menyiratkan bahwa "ini adalah preformatted, spasi dan garis istirahat harus dipertahankan". Ini memecah pemisahan gaya dan konten, karena jika Anda mencoba memformat ulang HTML menjadi "cantik" atau Anda memutarnya melalui siklus encode / decode seperti ini, maka run spasi / istirahat berkurang, dan encoder tidak memiliki cara mengetahui apakah OK untuk melakukannya, karena tidak mengetahuiwhite-space:pre-*;
indikator dalam file CSS eksternal!Trik jQuery tidak menyandikan tanda kutip dan di IE itu akan menghapus spasi Anda.
Berdasarkan templatetag melarikan diri di Django, yang saya kira sudah banyak digunakan / diuji, saya membuat fungsi ini yang melakukan apa yang dibutuhkan.
Ini bisa dibilang lebih sederhana (dan mungkin lebih cepat) daripada pemecahan masalah untuk masalah pengupasan spasi putih - dan mengkodekan tanda kutip, yang penting jika Anda akan menggunakan hasil di dalam nilai atribut misalnya.
Pembaruan 2013-06-17:
Dalam mencari pelarian tercepat saya telah menemukan implementasi
replaceAll
metode ini:http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(juga dirujuk di sini: Tercepat metode untuk mengganti semua instance karakter dalam string )
Beberapa hasil kinerja di sini:
http://jsperf.com/htmlencoderegex/25
Ini memberikan string hasil yang identik dengan
replace
rantai bawaan di atas. Aku akan sangat senang jika seseorang bisa menjelaskan mengapa ini lebih cepat !?Pembaruan 2015-03-04:
Saya baru saja memperhatikan bahwa AngularJS menggunakan persis metode di atas:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Mereka menambahkan beberapa penyempurnaan - mereka tampaknya menangani masalah Unicode yang tidak jelas serta mengubah semua karakter non-alfanumerik ke entitas. Saya mendapat kesan bahwa yang terakhir tidak diperlukan selama Anda memiliki charset UTF8 yang ditentukan untuk dokumen Anda.
Saya akan perhatikan bahwa (4 tahun kemudian) Django masih tidak melakukan hal-hal ini, jadi saya tidak yakin seberapa pentingnya hal itu:
https://github.com/django/django/django/blob/1.8b1/django/utils /html.py#L44
Pembaruan 2016-04-06:
Anda mungkin juga ingin melarikan diri ke garis miring
/
. Ini tidak diperlukan untuk penyandian HTML yang benar, namun direkomendasikan oleh OWASP sebagai langkah keamanan anti-XSS. (terima kasih kepada @JNF untuk menyarankan ini dalam komentar)sumber
'
sebagai ganti'
'
itu bukan entitas HTML yang valid./g
,.replace()
hanya akan menggantikan pertandingan pertama.Berikut adalah versi non-jQuery yang jauh lebih cepat daripada
.html()
versi jQuery dan.replace()
versi. Ini mempertahankan semua spasi putih, tetapi seperti versi jQuery, tidak menangani tanda kutip.Kecepatan: http://jsperf.com/htmlencoderegex/17
Demo:
Keluaran:
Naskah:
HTML:
sumber
.replace()
baru-baru ini disarankan oleh @SEoF ternyata jauh lebih cepat: jsperf.com/htmlencoderegex/22/g
,.replace()
hanya melakukan pertandingan pertama.replace('a', 'b', 'g')
yang bekerja sama denganreplace(/a/g, 'b')
... kecepatan juga identikSaya tahu ini adalah yang lama, tetapi saya ingin memposting variasi jawaban yang diterima yang akan berfungsi di IE tanpa menghapus baris:
sumber
Underscore menyediakan
_.escape()
dan_.unescape()
metode yang melakukan ini.sumber
Jawaban yang bagus. Perhatikan bahwa jika nilai untuk menyandikan adalah
undefined
ataunull
dengan jQuery 1.4.2 Anda mungkin mendapatkan kesalahan seperti:jQuery("<div/>").text(value).html is not a function
ATAU
Uncaught TypeError: Object has no method 'html'
Solusinya adalah memodifikasi fungsi untuk memeriksa nilai aktual:
sumber
jQuery('<div/>').text(value || '').html()
value
denganif
menghemat harus membuat DIV dengan cepat dan ambil nilainya. Ini bisa menjadi jauh lebih berkinerja jikahtmlEncode
dipanggil banyak DAN jika itu kemungkinanvalue
akan kosong.Bagi mereka yang lebih suka javascript biasa, berikut adalah metode yang berhasil saya gunakan:
sumber
FWIW, pengkodean tidak hilang. Pengkodean digunakan oleh parser markup (browser) selama pemuatan halaman. Setelah sumber dibaca dan diuraikan dan browser memiliki DOM dimuat ke dalam memori, pengkodean telah diuraikan menjadi apa yang diwakilinya. Jadi pada saat JS Anda dieksekusi untuk membaca apa pun dalam memori, karakter yang didapat adalah apa yang diwakili oleh pengkodean.
Saya mungkin beroperasi secara ketat pada semantik di sini, tetapi saya ingin Anda memahami tujuan pengkodean. Kata "hilang" membuatnya terdengar seperti sesuatu yang tidak berfungsi sebagaimana mestinya.
sumber
Lebih cepat tanpa Jquery. Anda dapat menyandikan setiap karakter di string Anda:
Atau hanya menargetkan karakter utama yang perlu dikhawatirkan (&, inebreaks, <,>, "dan ') seperti:
sumber
Prototipe memilikinya built-in kelas String . Jadi jika Anda menggunakan / berencana untuk menggunakan Prototipe, ia melakukan sesuatu seperti:
sumber
.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
Cukup mudah.Berikut ini adalah solusi javascript sederhana. Itu memperluas objek String dengan metode "HTMLEncode" yang dapat digunakan pada objek tanpa parameter, atau dengan parameter.
Saya telah membuat intisari "metode HTMLEncode untuk javascript" .
sumber
Berdasarkan sanitasi sudut ... (es6 modul syntax)
sumber
if (value === null | value === undefined) return '';
kesalahan ketik atau sebenarnya fitur? Jika demikian, mengapa menggunakan yang itu dan bukan yang biasa||
? Terima kasih!!== null
?undefined
adalah satu-satunya hal yang memiliki kesetaraan dengannull
, jadi dua triple-sama tidak diperlukan pulanull
dan0
keduanya palsu, ya, jadi Anda tidak bisa melakukannya!value
, tetapi intinya==
adalah membuat hal-hal tertentu lebih mudah.0 == null
itu salah.undefined == null
adalah benar. Anda bisa melakukannyavalue == null
Sejauh yang saya tahu tidak ada metode HTML Encode / Decode langsung di javascript.
Namun, yang dapat Anda lakukan, adalah menggunakan JS untuk membuat elemen arbitrer, mengatur teks dalamnya, lalu membacanya menggunakan innerHTML.
Katakanlah, dengan jQuery, ini seharusnya berfungsi:
Atau sesuatu seperti ini.
sumber
Anda tidak perlu melarikan diri / menyandikan nilai untuk memindahkannya dari satu bidang input ke yang lain.
JS tidak pergi menyisipkan HTML mentah atau apa pun; itu hanya memberitahu DOM untuk mengatur
value
properti (atau atribut; tidak yakin). Apa pun itu, DOM menangani masalah pengodean apa pun untuk Anda. Kecuali Anda melakukan sesuatu yang aneh seperti menggunakandocument.write
ataueval
, penyandian-HTML akan transparan secara efektif.Jika Anda berbicara tentang membuat kotak teks baru untuk menahan hasilnya ... masih mudah. Cukup lewati bagian statis HTML ke jQuery, lalu setel properti / atribut lainnya pada objek yang dikembalikannya kepada Anda.
sumber
Saya memiliki masalah yang sama dan menyelesaikannya menggunakan fungsi
encodeURIComponent
dari JavaScript ( dokumentasi )Misalnya, dalam kasus Anda jika Anda menggunakan:
dan
kamu akan mendapatkan
chalk%20%26%20cheese
. Bahkan ruang disimpan.Dalam kasus saya, saya harus menyandikan satu backslash dan kode ini berfungsi dengan baik
dan aku mengerti
name%2Fsurname
sumber
Inilah sedikit yang mengemulasi
Server.HTMLEncode
fungsi dari ASP Microsoft, ditulis dalam JavaScript murni:Hasilnya tidak menyandikan apostrof, tetapi menyandikan spesial HTML lainnya dan karakter apa pun di luar rentang 0x20-0x7e.
sumber
Fungsi pure-JS saya:
sumber
Jika Anda ingin menggunakan jQuery. Aku menemukan ini:
http://www.jquerysdk.com/api/jQuery.htmlspecialchars
(bagian dari jquery.string plugin yang ditawarkan oleh jQuery SDK)
Masalah dengan Prototipe yang saya percaya adalah bahwa ia memperluas objek dasar dalam JavaScript dan tidak akan kompatibel dengan jQuery yang mungkin Anda gunakan. Tentu saja, jika Anda sudah menggunakan Prototipe dan bukan jQuery, itu tidak akan menjadi masalah.
EDIT: Juga ada ini, yang merupakan port dari utilitas string Prototype untuk jQuery:
http://stilldesigning.com/dotstring/
sumber
Ini dari kode sumber ExtJS.
sumber
Akan menghasilkan:
<script>alert("I hack your site")</script>
.htmlEncode () akan dapat diakses di semua string setelah ditentukan.
sumber
HtmlEkode nilai yang diberikan
sumber
Saya mengalami beberapa masalah dengan backslash di string Domain \ User.
Saya menambahkan ini ke jawaban lain dari jawaban Anentropic
Yang saya temukan di sini: Bagaimana cara menghindari backslash dalam JavaScript?
sumber
Memilih apa
escapeHTML()
yang dilakukan di prototype.jsMenambahkan skrip ini membantu Anda melarikan diriHTML:
sekarang Anda dapat memanggil metode escapeHTML pada string di skrip Anda, seperti:
Semoga ini membantu siapa pun yang mencari solusi sederhana tanpa harus menyertakan seluruh prototipe.js
sumber
Dengan menggunakan beberapa jawaban lain di sini saya membuat versi yang menggantikan semua karakter terkait dalam satu pass terlepas dari jumlah karakter yang dikodekan berbeda (hanya satu panggilan ke
replace()
) sehingga akan lebih cepat untuk string yang lebih besar.Itu tidak bergantung pada DOM API untuk ada atau di perpustakaan lain.
Setelah menjalankannya sekali, sekarang Anda dapat menelepon
Mendapatkan
<>&"'
sumber
sumber