Pertanyaan Java Best Practices untuk Mencegah Cross Site Scripting [ditutup]


Saya telah melalui sepuluh kerentanan teratas OWASP dan menemukan bahwa Cross-Site Scripting adalah salah satu yang harus kami catat. Ada beberapa cara solusi yang direkomendasikan. Seseorang telah menyatakan bahwa Jangan gunakan validasi "daftar hitam" untuk mendeteksi XSS dalam input atau untuk menyandikan keluaran. Mencari dan mengganti hanya beberapa karakter (< dan > dan karakter atau frasa serupa lainnya seperti script) lemah dan telah berhasil diserang. Bahkan tidak dicentang “<b>” tag tidak aman dalam beberapa konteks. XSS memiliki jumlah varian mengejutkan yang membuatnya mudah untuk mem-bypass validasi daftar hitam. Solusi lain mengatakan bahwa pengkodean output yang kuat. Pastikan bahwa semua data yang diberikan pengguna secara tepat dikodekan entitas (HTML atau XML tergantung pada mekanisme output) sebelum rendering. Jadi, mana cara terbaik untuk mencegah scripting lintas situs untuk memvalidasi dan mengganti input atau encoding output?


32
2017-07-21 14:58


asal


Jawaban:


Praktik normal adalah HTML-escape apapun dikendalikan oleh pengguna data selama menampilkan kembali di JSP, tidak selama pengolahan data yang dikirimkan di servlet atau selama menyimpan di DB. Di JSP Anda dapat menggunakan JSTL (untuk menginstalnya, cukup turun jstl-1.2.jar di /WEB-INF/lib) <c:out> tag atau fn:escapeXml berfungsi untuk ini. Misalnya.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<p>Welcome <c:out value="${user.name}" /></p>

dan

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input name="username" value="${fn:escapeXml(param.username)}">

Itu dia. Tidak perlu daftar hitam. Perhatikan bahwa data yang dikontrol oleh pengguna segala sesuatu yang datang dengan permintaan HTTP: parameter permintaan, body dan header (!!).

Jika Anda melewatkan HTML-nya selama memproses data yang dikirimkan dan / atau menyimpannya di DB juga, maka itu semua tersebar di kode bisnis dan / atau dalam database. Itu hanya masalah perawatan dan Anda akan berisiko lolos ganda atau lebih ketika melakukannya di tempat yang berbeda (mis. & akan menjadi &amp;amp; dari pada &amp; sehingga pengguna akhir benar-benar akan melihat &amp; dari pada & dalam penglihatan. Kode bisnis dan DB pada gilirannya tidak sensitif untuk XSS. Hanya pandangannya saja. Anda kemudian harus melarikan diri saja disana dalam penglihatan.

Lihat juga:


39
2017-08-10 01:22



Gunakan keduanya. Bahkan merujuk panduan seperti OWASP XSS Prevention cheat sheet, pada kemungkinan kasus untuk penggunaan penyandian output dan validasi input.

Validasi masukan membantu ketika Anda tidak dapat mengandalkan pengkodean output dalam kasus-kasus tertentu. Misalnya, Anda lebih baik memvalidasi masukan yang muncul di URL daripada menyandikan URL itu sendiri (Apache tidak akan melayani URL yang dienkodekan url). Atau dalam hal ini, validasi masukan yang muncul dalam ekspresi JavaScript.

Pada akhirnya, aturan jempol sederhana akan membantu - jika Anda tidak cukup mempercayai masukan pengguna atau jika Anda mencurigai bahwa sumber tertentu dapat mengakibatkan serangan XSS meskipun ada penyandian keluaran, validasi terhadap daftar putih.

Silakan lihat di OWASP ESAPIkode sumber tentang bagaimana penyandian output dan validator masukan ditulis dalam pustaka keamanan.


6
2017-07-21 20:30



Preferensi saya adalah untuk menyandikan semua karakter non-alfaumerik sebagai entitas karakter numerik HTML. Karena hampir, jika tidak semua serangan membutuhkan karakter non-alfumerik (seperti <, ", dll.) Ini akan menghilangkan sebagian besar output berbahaya.

Format adalah & # N ;, di mana N adalah nilai numerik dari karakter (Anda hanya dapat mentransmisikan karakter ke int dan menggabungkan dengan string untuk mendapatkan nilai desimal). Sebagai contoh:

// pseudocode java-ish
StringBuffer safestrbuf = StringBuffer baru (string.length () * 4);
foreach (char c: string.split ()) {
  if (Character.isAlphaNumeric (c)) safestrbuf.append (c);
  else safestrbuf.append ("" + (int) simbol);

Anda juga harus memastikan bahwa Anda segera menyandikan sebelum keluaran ke browser, untuk menghindari pengkodean ganda, atau pengkodean untuk HTML tetapi mengirim ke lokasi yang berbeda.


0
2017-07-21 17:33