Apakah ada cara yang direkomendasikan untuk melarikan diri <
, >
, "
dan &
karakter ketika keluaran HTML dalam kode Java polos? (Selain secara manual melakukan hal berikut, yaitu).
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "<").replace("&", "&"); // ...
source.replace("&", "&").replace("<", "<");
Jawaban:
StringEscapeUtils dari Apache Commons Lang :
Untuk versi 3 :
sumber
StringEscapeUtils
bagus, itu tidak akan keluar dari spasi dengan benar untuk atribut jika Anda ingin menghindari normalisasi HTML / XML spasi. Lihat jawaban saya untuk detail lebih lanjut.Sebuah alternatif untuk Apache Commons: Gunakan Musim Semi 's
HtmlUtils.htmlEscape(String input)
metode.sumber
StringEscapeUtils.escapeHtml()
dariapache-commons
2.6) karena meninggalkan karakter Rusia apa adanya.Metode pendek yang bagus:
Berdasarkan https://stackoverflow.com/a/8838023/1199155 (amp hilang di sana). Keempat karakter yang diperiksa dalam klausa if adalah satu-satunya di bawah 128, menurut http://www.w3.org/TR/html4/sgml/entities.html
sumber
Ada versi yang lebih baru dari perpustakaan Lang Apache Commons dan menggunakan nama paket yang berbeda (org.apache.commons.lang3). The
StringEscapeUtils
sekarang memiliki metode statis yang berbeda untuk melarikan diri berbagai jenis dokumen ( http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html ). Jadi untuk menghindari string HTML versi 4.0:sumber
Bagi mereka yang menggunakan Google Guava:
sumber
Di android (API 16 atau lebih tinggi) Anda dapat:
atau untuk API yang lebih rendah:
sumber
escapeHtml
bukanhtmlEncode
?Hati-hati dengan ini. Ada sejumlah 'konteks' yang berbeda dalam dokumen HTML: Di dalam elemen, nilai atribut yang dikutip, nilai atribut yang tidak dikutip, atribut URL, javascript, CSS, dll ... Anda harus menggunakan metode pengkodean yang berbeda untuk masing-masing ini untuk mencegah Cross-Site Scripting (XSS). Periksa Lembar Curang Pencegahan OWASP XSS untuk perincian tentang masing-masing konteks ini. Anda dapat menemukan metode melarikan diri untuk masing-masing konteks ini di perpustakaan OWASP ESAPI - https://github.com/ESAPI/esapi-java-legacy .
sumber
Untuk beberapa tujuan, HtmlUtils :
sumber
Meskipun jawaban @ dfa
org.apache.commons.lang.StringEscapeUtils.escapeHtml
bagus dan saya telah menggunakannya di masa lalu, seharusnya tidak digunakan untuk keluar dari atribut HTML (atau XML) kalau tidak spasi akan dinormalisasi (artinya semua karakter spasi yang berdekatan menjadi ruang tunggal).Saya tahu ini karena saya memiliki bug yang diajukan terhadap perpustakaan saya (JATL) untuk atribut di mana spasi putih tidak dipertahankan. Jadi saya memiliki drop (copy n 'paste) kelas (yang saya mencuri beberapa dari JDOM) yang membedakan pelarian atribut dan konten elemen .
Meskipun ini mungkin tidak terlalu penting di masa lalu (atribut yang tepat melarikan diri) itu menjadi semakin menarik mengingat penggunaan penggunaan
data-
penggunaan atribut HTML5 .sumber
org.apache.commons.lang3.StringEscapeUtils sekarang sudah tidak digunakan lagi. Anda sekarang harus menggunakan org.apache.commons.text.StringEscapeUtils oleh
sumber
Sebagian besar perpustakaan menawarkan pelarian semua yang mereka bisa, termasuk ratusan simbol dan ribuan karakter non-ASCII yang bukan yang Anda inginkan di dunia UTF-8.
Juga, seperti yang dicatat Jeff Williams, tidak ada opsi "escape HTML", ada beberapa konteks.
Dengan asumsi Anda tidak pernah menggunakan atribut yang tidak dikutip, dan mengingat bahwa ada konteks yang berbeda, itu telah menulis versi saya sendiri:
Pertimbangkan copy-paste dari Gist tanpa batas panjang garis .
sumber