Apakah ada cara mudah untuk mengambil string html dalam JavaScript dan menghapus html?
javascript
html
string
Bryan
sumber
sumber
strip("<img onerror='alert(\"could run arbitrary JS here\")' src=bogus>")
sumber
<img src=http://www.google.com.kh/images/srpr/nav_logo27.png onload="alert(42)"
jika Anda menyuntikkan melaluidocument.write
atau menyatukan dengan string yang berisi>
sebelum menyuntikkan melaluiinnerHTML
.>
akan dibiarkan dalam detik Tapi itu bukan bahaya injeksi. Bahaya terjadi karena<
dibiarkan di yang pertama, yang menyebabkan parser HTML berada dalam konteks selain status data saat yang kedua dimulai. Perhatikan tidak ada transisi dari status data aktif>
.<button onClick="dostuff('>');"></button>
Mengasumsikan HTML yang ditulis dengan benar, Anda masih perlu memperhitungkan bahwa tanda yang lebih besar dari mungkin ada di suatu tempat dalam teks yang dikutip dalam atribut. Anda juga ingin menghapus semua teks di dalam<script>
tag, setidaknya.Cara termudah:
Itu mengambil semua teks dari string html.
sumber
Saya ingin membagikan versi yang diedit dari jawaban yang disetujui Shog9 .
Seperti yang ditunjukkan Mike Samuel dengan komentar, fungsi itu dapat mengeksekusi kode javascript inline.
Tapi Shog9 benar ketika mengatakan "biarkan browser melakukannya untuk Anda ..."
jadi .. ini versi edit saya, menggunakan DOMParser :
di sini kode untuk menguji javascript inline:
Juga, itu tidak meminta sumber daya di parse (seperti gambar)
sumber
Sebagai ekstensi ke metode jQuery, jika string Anda mungkin tidak mengandung HTML (mis. Jika Anda mencoba menghapus HTML dari bidang formulir)
akan mengembalikan string kosong jika tidak ada HTML
Menggunakan:
sebagai gantinya.
Pembaruan: Seperti yang telah ditunjukkan dalam komentar, dalam beberapa keadaan solusi ini akan mengeksekusi javascript yang terkandung di dalamnya
html
jika nilaihtml
dapat dipengaruhi oleh penyerang, gunakan solusi yang berbeda.sumber
$("<p>").html(html).text();
jQuery('<span>Text :) <img src="a" onerror="alert(1)"></span>').text()
Konversi HTML untuk Email Biasa mengirim email menjaga hyperlink (a href) tetap utuh
Fungsi di atas yang diposting oleh hypoxide berfungsi dengan baik, tetapi saya mencari sesuatu yang pada dasarnya akan mengubah HTML yang dibuat dalam editor Web RichText (misalnya FCKEditor) dan menghapus semua HTML tetapi meninggalkan semua Tautan karena fakta bahwa saya menginginkan HTML dan versi teks biasa untuk membantu membuat bagian yang benar ke email STMP (baik HTML maupun teks biasa).
Setelah lama mencari Google sendiri dan kolega saya datang dengan menggunakan mesin regex di Javascript:
yang
str
variabel dimulai seperti ini:dan kemudian setelah kode itu dijalankan terlihat seperti ini: -
Seperti yang Anda lihat, semua HTML telah dihapus dan Tautan telah dipertahankan dengan teks hyperlink masih utuh. Saya juga telah mengganti tag
<p>
dan<br>
dengan\n
(baris baru char) sehingga semacam pemformatan visual telah dipertahankan.Untuk mengubah format tautan (mis.
BBC (Link->http://www.bbc.co.uk)
) Cukup edit$2 (Link->$1)
, di mana$1
href URL / URI dan$2
teksnya adalah hyperlink. Dengan tautan langsung di badan teks biasa, sebagian besar Klien Mail SMTP mengonversi ini sehingga pengguna memiliki kemampuan untuk mengekliknya.Semoga Anda menemukan ini berguna.
sumber
Peningkatan jawaban yang diterima.
Dengan cara ini sesuatu yang berjalan seperti ini tidak akan membahayakan:
Firefox, Chromium, dan Explorer 9+ aman. Opera Presto masih rentan. Juga gambar yang disebutkan dalam string tidak diunduh di Chromium dan Firefox yang menyimpan permintaan http.
sumber
<script><script>alert();
Ini harus dilakukan pada lingkungan Javascript apa pun (termasuk NodeJS).
sumber
<html><style..>* {font-family:comic-sans;}</style>Some Text</html>
Saya mengubah jawaban Jibberboy2000 untuk menyertakan beberapa
<BR />
format tag, menghapus semua yang ada di dalam<SCRIPT>
dan<STYLE>
tag, memformat HTML yang dihasilkan dengan menghapus beberapa jeda baris dan spasi, dan mengonversi beberapa kode yang dikodekan HTML menjadi normal. Setelah beberapa pengujian tampak bahwa Anda dapat mengubah sebagian besar halaman web penuh menjadi teks sederhana di mana judul halaman dan konten dipertahankan.Dalam contoh sederhana,
menjadi
Fungsi JavaScript dan halaman pengujian terlihat seperti ini:
Itu digunakan dengan HTML ini:
sumber
/<p.*>/gi
seharusnya begitu/<p.*?>/gi
.<br>
tag Anda bisa menggunakan ekspresi reguler baik bukan:/<br\s*\/?>/
cara itu Anda hanya memiliki satu menggantikan bukannya 3. Juga tampaknya bagi saya bahwa kecuali untuk decoding entitas Anda dapat memiliki satu regex, sesuatu seperti ini:/<[a-z].*?\/?>/
.Ini adalah versi regex, yang lebih tangguh terhadap HTML yang rusak, seperti:
Tag tidak tertutup
Some text <img
"<", ">" atribut tag di dalam
Some text <img alt="x > y">
Baris baru
Some <a href="http://google.com">
Kode
sumber
Solusi lain, yang diakui kurang elegan daripada nickf atau Shog9, adalah berjalan secara DOM mulai dari tag <body> dan menambahkan setiap node teks.
sumber
Jika Anda ingin menyimpan tautan dan struktur konten (h1, h2, dll) maka Anda harus memeriksa TextVersionJS Anda dapat menggunakannya dengan HTML apa pun, meskipun itu dibuat untuk mengubah email HTML menjadi teks biasa.
Penggunaannya sangat sederhana. Misalnya di node.js:
Atau di browser dengan js murni:
Ini juga bekerja dengan require.js:
sumber
Setelah mencoba semua jawaban yang disebutkan sebagian besar jika tidak semuanya memiliki kasus tepi dan tidak dapat sepenuhnya mendukung kebutuhan saya.
Saya mulai mengeksplorasi bagaimana php melakukannya dan menemukan lib php.js yang mereplikasi metode strip_tags di sini: http://phpjs.org/functions/strip_tags/
sumber
allowed == ''
yang saya pikir adalah apa yang diminta OP, yang hampir seperti yang dijawab Byron di bawah ini (Byron hanya[^>]
salah.)allowed
param, Anda rentan terhadap XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
pengembalian<p onclick="alert(1)">mytext</p>
Akun untuk atribut dalam dan
<img onerror="javascript">
dalam elemen dom yang baru dibuat.pemakaian:
demo:
https://jsfiddle.net/gaby_de_wilde/pqayphzd/
demo jawaban teratas melakukan hal-hal buruk:
https://jsfiddle.net/gaby_de_wilde/6f0jymL6/1/
sumber
string with <a malicious="attribute \">this text should be removed, but is not">example</a>
.).Banyak orang sudah menjawab ini, tapi saya pikir mungkin berguna untuk membagikan fungsi yang saya tulis yang menghapus tag HTML dari sebuah string tetapi memungkinkan Anda untuk memasukkan array tag yang tidak ingin Anda hapus. Cukup singkat dan telah bekerja dengan baik untuk saya.
sumber
Saya pikir cara termudah adalah dengan hanya menggunakan Ekspresi Reguler seperti seseorang yang disebutkan di atas. Meskipun tidak ada alasan untuk menggunakan banyak dari mereka. Mencoba:
sumber
[^<>]
dengan[^>]
karena tag yang valid tidak dapat menyertakan<
karakter, maka kerentanan XSS menghilang.Saya membuat beberapa modifikasi pada skrip Jibberboy2000 asli Semoga bermanfaat bagi seseorang
sumber
Berikut adalah versi yang agaknya membahas masalah keamanan @ MikeSamuel:
Catatan, itu akan mengembalikan string kosong jika markup HTML tidak sah XML (alias, tag harus ditutup dan atribut harus dikutip). Ini tidak ideal, tetapi menghindari masalah memiliki potensi mengeksploitasi keamanan.
Jika tidak memiliki markup XML yang valid adalah persyaratan untuk Anda, Anda dapat mencoba menggunakan:
tapi itu juga bukan solusi yang sempurna karena alasan lain.
sumber
Anda dapat dengan aman menghapus tag html menggunakan atribut sandbox iframe .
Idenya di sini adalah bahwa alih-alih mencoba regex string kami, kami mengambil keuntungan dari parser asli browser dengan menyuntikkan teks ke dalam elemen DOM dan kemudian meminta
textContent
/innerText
properti dari elemen itu.Elemen yang paling cocok untuk menyuntikkan teks kita adalah iframe kotak pasir, dengan cara itu kita dapat mencegah eksekusi kode arbitrer (Juga dikenal sebagai XSS ).
Kelemahan dari pendekatan ini adalah ia hanya berfungsi di browser.
Inilah yang saya buat (Tidak teruji perang):
Penggunaan ( demo ):
sumber
let
danconst
operator. Juga, menggunakan solusi Anda, saya mendapat banyak referensi untukiframes
tidak digunakan di dalam dokumen. Pertimbangkan untuk menambahkandocument.body.removeChild(sandbox)
kode untuk pembaca berbasis pasta yang akan datang.Dengan jQuery, Anda cukup mengambilnya dengan menggunakan
sumber
Kode di bawah ini memungkinkan Anda untuk mempertahankan beberapa tag html sambil menghapus semua yang lain
sumber
phpjs
). Jika Anda menggunakanallowed
param, Anda rentan terhadap XSS:stripTags('<p onclick="alert(1)">mytext</p>', '<p>')
pengembalian<p onclick="alert(1)">mytext</p>
Dimungkinkan juga untuk menggunakan parser JS HTML htmlparser2 murni yang fantastis . Ini demo yang berfungsi:
Outputnya adalah
This is a simple example.
Lihat beraksi di sini: https://tonicdev.com/jfahrenkrug/extract-text-from-html
Ini berfungsi di kedua simpul dan browser jika Anda mengemas aplikasi web Anda menggunakan alat seperti webpack.
sumber
Saya hanya perlu menghapus
<a>
tag dan menggantinya dengan teks tautan.Ini sepertinya bekerja dengan baik.
sumber
title="..."
.Untuk solusi yang lebih mudah, coba ini => https://css-tricks.com/snippets/javascript/strip-html-tags-in-javascript/
sumber
Saya sendiri telah membuat ekspresi reguler:
sumber
jquery 2 baris sederhana untuk menghapus html.
sumber
Jawaban yang diterima sebagian besar berfungsi dengan baik, namun di IE jika
html
stringnull
Anda mendapatkan"null"
(bukan ''). Tetap:sumber
Menggunakan Jquery:
sumber
input
elemen hanya mendukung satu teks baris :Pembaruan: ini berfungsi seperti yang diharapkan
sumber
Tetapkan ini sebagai plugin jquery dan gunakan seperti berikut:
sumber