Ringkasan eksekutif
Jim Manico, project lead di OWASP, baru merilis versi baru dari dua library yang menurutnya masih dipakai luas tapi sering dilupakan: OWASP Java Encoder (1.6.0) dan OWASP Java HTML Sanitizer (20261011.1). Tulisannya di Foojay intinya satu permintaan sederhana ke developer Java: tolong update, dan kalau dipakai di produksi, kasih feedback.
Masalah yang ia selesaikan
Kedua library ini menyelesaikan dua sisi masalah XSS yang berbeda. Java Encoder dipakai ketika kita mau mem-blok semua markup berbahaya dengan encoding sesuai konteks keluaran — encoding untuk teks di dalam elemen HTML itu beda dengan encoding untuk nilai di dalam atribut HTML, dan API-nya memaksa kita memilih konteks yang tepat secara eksplisit. Java HTML Sanitizer dipakai untuk kasus kebalikannya: ketika user memang boleh mengirim HTML terformat (komentar dengan bold, deskripsi dengan paragraf), dan kita tidak mau encode semuanya jadi teks mentah, tapi tetap harus membuang tag dan atribut yang berbahaya sesuai policy yang kita definisikan sendiri.
Fitur utama dan contoh kode
Java Encoder 1.6.0 (org.owasp.encoder:encoder) tidak punya runtime dependency dan masih mendukung Java 8+. Contoh dua konteks keluaran yang paling umum:
import org.owasp.encoder.Encode;
public class EncoderExample {
public static void main(String[] args) {
String name = "Jim & <friends>";
String paragraph = "<p>" + Encode.forHtmlContent(name) + "</p>";
String input = "<input value=\""
+ Encode.forHtmlAttribute(name) + "\">";
System.out.println(paragraph);
System.out.println(input);
}
}Yang menarik dari changelog: versi 1.5.0 kemarin memperbaiki bug keamanan di mana fragmen yang sudah di-encode, kalau ditaruh bersebelahan dengan teks yang dipercaya, bisa gabung membentuk delimiter HTML/XML yang berbahaya — encoder hanya melihat value yang kita berikan, sedangkan browser melihat halaman yang sudah dirakit. Versi 1.6.0 sendiri bukan security fix baru, tapi menghaluskan encoder JavaScript (general dan block) dengan mengurangi escaping huruf yang sebenarnya tidak perlu. API publik dan baseline Java 8 tidak berubah, tapi hasil byte yang di-encode dan sedikit perilaku streaming-nya berubah — jadi kalau ada test yang membandingkan string hasil encode secara exact match, itu perlu dicek ulang. Kalau pakai EncodedWriter dengan encoder JavaScript general/block, jangan lupa flush sebelum menulis langsung ke underlying writer-nya. Satu hal lagi yang perlu dicatat: adapter encoder-esapi sudah retired dan tidak ada versi yang didukung lagi, jadi yang masih pakai itu disarankan pindah lewat migration guide ESAPI adapter yang disediakan project.
Untuk HTML Sanitizer (com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer, versi 20261011.1), policy dasarnya kira-kira begini:
import org.owasp.html.HtmlPolicyBuilder;
import org.owasp.html.PolicyFactory;
public class SanitizerExample {
public static void main(String[] args) {
PolicyFactory policy = new HtmlPolicyBuilder()
.allowElements("p", "strong", "em")
.toFactory();
String submittedHtml = "<p>Hello <strong>Java</strong>!"
+ "<img src=x onerror=alert(1)></p>";
System.out.println(policy.sanitize(submittedHtml));
}
}Hasilnya tinggal <p>Hello <strong>Java</strong>!</p> — tag img dengan onerror otomatis hilang karena tidak di-allowlist. Rilis-rilis terakhir fokus ke robustness parsing HTML dan CSS: ada advisory soal fungsi CSS yang di-nest terlalu dalam, yang bisa menghabiskan thread stack saat sanitizer memproses atribut style — ini sudah dibatasi lewat nesting limit di versi 20260924.1. Versi terbaru, 20261011.1, lebih ke packaging fix: implementasi kompatibilitas Java 10 dipindah ke versioned directory di dalam JAR dan satu class yang tidak perlu dihapus, supaya build Java 8 yang pakai Maven Enforcer rule enforceBytecodeVersion (mode default, non-strict) tidak perlu lagi workaround untuk dua class tersebut.
Dampak dan catatan upgrade
Tidak ada breaking API di kedua library, tapi Manico menyarankan dua hal konkret sebelum asal bump versi. Pertama, cek versi yang benar-benar teresolve di aplikasi — dependency bisa masuk transitif lewat library lain, jadi versi di satu POM belum tentu versi yang jalan di production. Kedua, jalankan upgrade lawan skenario nyata: untuk Encoder, cek ulang konteks output yang dipakai dan test yang bergantung pada exact byte hasil encode; untuk Sanitizer, uji policy dengan output editor asli, formatting yang wajar, dan input rusak yang biasanya sudah ada di regression test, termasuk CSS representatif kalau styling diizinkan. Buat yang masih pakai JSP, pastikan versi core dan adapter JSP tetap sinkron, pilih adapter yang sesuai API javax atau Jakarta di container masing-masing.
---
Pertama diumumkan di Foojay.io (Friends of OpenJDK). Baca sumber aslinya untuk detail lengkap.