Saya memiliki string seperti
var str = 'One & two & three';
diterjemahkan ke dalam HTML oleh server web. Saya perlu mengubah string itu menjadi
'One & two & three'
Saat ini, itulah yang saya lakukan (dengan bantuan jQuery):
$(document.createElement('div')).html('{{ driver.person.name }}').text()
Namun saya memiliki perasaan gelisah bahwa saya salah melakukannya. saya telah mencoba
unescape("&")
tetapi tampaknya tidak berfungsi, begitu pula komponen decodeURI / decodeURIC.
Apakah ada cara lain yang lebih asli dan elegan untuk melakukannya?
javascript
html
text
decode
Seni
sumber
sumber
escape
d atau URI , fungsi-fungsi itu tidak akan berfungsi.𝕫
. Ini adalah masalah dengan spec yang berkembang; dengan demikian, Anda harus memilih alat yang benar-benar dipertahankan untuk menyelesaikannya.Jawaban:
Opsi yang lebih modern untuk menafsirkan HTML (teks dan lainnya) dari JavaScript adalah dukungan HTML di
DOMParser
API ( lihat di sini di MDN ). Ini memungkinkan Anda untuk menggunakan parser HTML asli peramban untuk mengonversi string ke dokumen HTML. Ini telah didukung dalam versi baru dari semua browser utama sejak akhir 2014.Jika kita hanya ingin mendekodekan beberapa konten teks, kita dapat meletakkannya sebagai satu-satunya konten dalam badan dokumen, parsing dokumen, dan mengeluarkan isinya
.body.textContent
.Kita dapat melihat dalam spesifikasi draf untuk
DOMParser
JavaScript yang tidak diaktifkan untuk dokumen yang diuraikan, sehingga kami dapat melakukan konversi teks ini tanpa masalah keamanan.Ini di luar cakupan pertanyaan ini, tetapi harap perhatikan bahwa jika Anda mengambil sendiri simpul DOM yang diurai (bukan hanya konten teks mereka) dan memindahkannya ke dokumen DOM yang hidup, ada kemungkinan bahwa skrip mereka akan diaktifkan kembali, dan mungkin ada menjadi masalah keamanan. Saya belum merisetnya, jadi harap berhati-hati.
sumber
Apakah Anda perlu mendekode semua entitas HTML yang disandikan atau hanya
&
dirinya sendiri?Jika Anda hanya perlu menangani
&
maka Anda bisa melakukan ini:Jika Anda perlu mendekode semua entitas HTML maka Anda dapat melakukannya tanpa jQuery:
Harap perhatikan komentar Mark di bawah ini yang menyoroti celah keamanan dalam versi yang lebih awal dari jawaban ini dan merekomendasikan penggunaan
textarea
daripadadiv
untuk mengurangi potensi kerentanan XSS. Kerentanan ini ada apakah Anda menggunakan jQuery atau JavaScript biasa.sumber
encoded='<img src="bla" onerror="alert(1)">'
kemudian cuplikan di atas akan menampilkan peringatan. Ini berarti jika teks Anda yang dikodekan berasal dari input pengguna, mendekode dengan potongan ini dapat menghadirkan kerentanan XSS.null
setelah mendapatkan teks, peringatan di img tidak dipecat - jsfiddle.net/Mottie/gaBeb/128alert(1)
masih menyala untuk saya di Chrome di OS X. Jika Anda ingin varian aman dari hack ini, coba gunakan atextarea
.Matthias Bynens memiliki perpustakaan untuk ini: https://github.com/mathiasbynens/he
Contoh:
Saya sarankan mendukungnya daripada peretasan yang melibatkan pengaturan konten HTML suatu elemen dan kemudian membaca kembali konten teksnya. Pendekatan semacam itu bisa berhasil, tetapi sangat berbahaya dan memberikan peluang XSS jika digunakan pada input pengguna yang tidak dipercaya.
Jika Anda benar-benar tidak tega memuat di perpustakaan, Anda dapat menggunakan
textarea
retasan yang dijelaskan dalam jawaban ini untuk pertanyaan hampir duplikat, yang, tidak seperti berbagai pendekatan serupa yang telah disarankan, tidak memiliki celah keamanan yang saya ketahui:Tetapi perhatikan masalah keamanan, yang memengaruhi pendekatan serupa dengan yang ini, yang saya cantumkan dalam jawaban terkait! Pendekatan ini adalah peretasan, dan perubahan di masa depan terhadap konten yang diizinkan
textarea
(atau bug pada browser tertentu) dapat menyebabkan kode yang bergantung padanya tiba-tiba memiliki lubang XSS suatu hari.sumber
he
benar-benar hebat! Terima kasih banyak atas rekomendasinya!Ini dari kode sumber ExtJS.
sumber
htmlEnDecode.htmlDecode('€')
harus kembali'€'
, tetapi sebaliknya kembali'€'
.element.innerText
juga melakukan trik.sumber
Anda dapat menggunakan fungsi Lodash unescape / escape https://lodash.com/docs/4.17.5#unescape
str akan menjadi
'fred, barney, & pebbles'
sumber
Jika Anda mencarinya, seperti saya - sementara itu ada metode JQuery yang bagus dan aman.
https://api.jquery.com/jquery.parsehtml/
Anda bisa f.ex. ketikkan ini di konsol Anda:
Jadi $ .parseHTML (x) mengembalikan sebuah array, dan jika Anda memiliki markup HTML dalam teks Anda, array.length akan lebih besar dari 1.
sumber
x
memiliki nilai<script>alert('hello');</script>
di atas akan crash. Di jQuery saat ini, ia tidak akan benar-benar mencoba menjalankan skrip, tetapi[0]
akan menghasilkanundefined
sehingga panggilan ketextContent
akan gagal dan skrip Anda akan berhenti di situ.$('<div />').html(x).text();
terlihat lebih aman - via gist.github.com/jmblog/3222899jQuery akan menyandikan dan mendekode untuk Anda. Namun, Anda perlu menggunakan tag textarea, bukan div.
sumber
.html()
. Jadi bahkan menggunakan atextarea
tidak cukup untuk memastikan keamanan di sini; Saya sarankan tidak menggunakan jQuery untuk tugas ini dan menulis kode yang setara dengan API DOM biasa . (Ya, perilaku lama oleh jQuery itu gila dan mengerikan.)Pertama buat suatu
<span id="decodeIt" style="display:none;"></span>
tempat di tubuhSelanjutnya, tetapkan string yang akan diterjemahkan sebagai innerHTML untuk ini:
Akhirnya,
Ini adalah kode keseluruhan:
sumber
stringtodecode
mengandung sesuatu seperti<script>alert(1)</script>
.solusi javascript yang menangkap yang umum:
ini kebalikan dari https://stackoverflow.com/a/4835406/2738039
sumber
map[c] || ''
tidak dikenal tidak akan ditampilkan sebagaiundefined
unescapeHtml(str){ var map = {amp: '&', lt: '<', le: '≤', gt: '>', ge: '≥', quot: '"', '#039': "'"} return str.replace(/&([^;]+);/g, (m, c) => map[c]|| '') }
Untuk cowok satu baris:
sumber
Pertanyaannya tidak menentukan asal dari
x
tetapi masuk akal untuk mempertahankan, jika kita bisa, terhadap masukan berbahaya (atau hanya tidak terduga, dari aplikasi kita sendiri). Misalnya, anggaplahx
memiliki nilai& <script>alert('hello');</script>
. Cara aman dan sederhana untuk menangani ini di jQuery adalah:Ditemukan melalui https://gist.github.com/jmblog/3222899 . Saya tidak bisa melihat banyak alasan untuk menghindari menggunakan solusi ini mengingat setidaknya itu pendek, jika tidak lebih pendek dari beberapa alternatif dan memberikan pertahanan terhadap XSS.
(Saya awalnya memposting ini sebagai komentar, tetapi saya menambahkannya sebagai jawaban karena komentar berikutnya di utas yang sama meminta saya melakukannya).
sumber
Saya mencoba segalanya untuk menghapus & dari array JSON. Tidak ada contoh di atas, tetapi https://stackoverflow.com/users/2030321/chris memberikan solusi hebat yang membuat saya memperbaiki masalah saya.
Saya tidak menggunakan, karena saya tidak mengerti bagaimana cara memasukkannya ke jendela modal yang menarik data JSON ke dalam array, tapi saya coba ini berdasarkan contoh, dan itu berhasil:
Saya suka karena sederhana, dan berfungsi, tetapi tidak yakin mengapa itu tidak banyak digunakan. Dicari hai & rendah untuk menemukan solusi sederhana. Saya terus mencari pemahaman tentang sintaks, dan jika ada risiko menggunakan ini. Belum menemukan apa pun.
sumber