Praktik Terbaik: Pembersihan HTML yang dibuat pengguna

Saya sedang mengkode lebar editor WYSIWYG designMode="on" di iframe. Editor berfungsi dengan baik dan saya menyimpan kode apa adanya di database.

Sebelum mengeluarkan html saya perlu "membersihkan" dengan php di sisi server untuk menghindari skrip lintas situs dan hal-hal menakutkan lainnya. Apakah ada praktik terbaik tentang cara melakukan ini? Tag apa yang berbahaya?

PEMBARUAN: Kesalahan ketik diperbaiki, Apa yang Anda Lihat Adalah Apa yang Anda Dapatkan. Tidak ada yang baru :)


person Martin    schedule 05.05.2010    source sumber
comment
Jika Anda bertekad untuk menerapkannya sendiri, sebaiknya Anda melihat ha.ckers.org/ xss.html - daftar serangan yang diketahui di berbagai browser.   -  person FalseVinylShrub    schedule 06.05.2010
comment
Pertanyaan bagus - Saya bertanya-tanya bagaimana stackoverflow melindungi dirinya sendiri...   -  person JDelage    schedule 25.03.2011


Jawaban (4)


Praktik terbaiknya adalah hanya mengizinkan hal-hal tertentu yang Anda tahu tidak berbahaya, dan menghapus/menghindari semua hal lainnya. Lihat makalah Berbahaya Otomatis Deteksi dan Penghapusan Kode di Web (OWASP AntiSamy) untuk diskusi mengenai hal ini (perpustakaan ditujukan untuk Java, namun prinsipnya berlaku untuk bahasa apa pun).

person Chris Lercher    schedule 05.05.2010
comment
Saya memulai dengan cara itu, tetapi karena semua browser menerapkan hal ini secara berbeda, saya akan mendapatkan banyak tag untuk hal yang sama yang harus saya izinkan. Misalnya teks tebal dilakukan setidaknya dengan 3 cara berbeda. Jadi itu akan menjadi kumpulan regex yang sangat besar. Anda juga dapat menempelkan format html apa pun yang Anda inginkan di editor, seperti dari email html atau semacamnya. Dan itu terlihat bagus di editor tetapi tidak akan berfungsi setelah melarikan diri. - person Martin; 05.05.2010
comment
Itu sebabnya AntiSamy sudah hadir dengan beberapa kumpulan contoh. Mungkin, ada juga perpustakaan PHP (atau Anda dapat membuatnya?) Anda tidak akan pernah mencapainya dengan cara sebaliknya (dengan memasukkan ke dalam daftar hitam): Setiap orang yang mencoba ini sebelumnya, telah gagal - hal ini tidak mungkin dilakukan secara realistis - akan ada sesuatu yang belum Anda liput (yang berakibat fatal untuk dimasukkan ke dalam daftar hitam, namun tidak terlalu menjadi masalah ketika memasukkan ke dalam daftar putih). Idealnya, jika Anda dapat menghindari HTML, gunakan Markdown dll, seperti yang disarankan oleh Hank! - person Chris Lercher; 05.05.2010
comment
@Martin Anda BENAR-BENAR tidak boleh menggunakan regex untuk ini. Ada alasan jawaban ini didapat (bersih) 3000 suara positif. - person Hank Gay; 05.05.2010
comment
Oke, sekarang saya yakin bahwa saya harus memasukkan daftar putih, bukan daftar hitam. @Hank Gay: Tapi saya tidak akan menguraikan html, saya hanya akan mengganti ‹ dengan lalu mengganti kembali ke ‹ pada sekumpulan kecil pola yang diketahui. Apakah itu masih seperti pergi kencan dengan setan? - person Martin; 06.05.2010

Jika Anda benar-benar ingin mengizinkan hal ini, Anda harus menggunakan pendekatan daftar putih.

Pendekatan terbaik mungkin adalah dengan melarang HTML dan menggunakan format markup yang disederhanakan; Anda dapat melakukan pra-render ke HTML dan menyimpannya di database jika kinerja menjadi perhatian. Menghindari masalah seperti ini adalah salah satu alasan utama menggunakan Penurunan harga, Tekstil, reStructuredText, dll.

CATATAN: Saya menautkan ke GitHub-Flavored Markdown (GFM), bukan Standard Markdown (SM). GFM mengatasi beberapa masalah umum yang dialami pengguna akhir dengan SM.

person Hank Gay    schedule 05.05.2010

Saya melihat pertanyaan yang sama baru-baru ini dengan Perl sebagai bahasa sisi server.

Saat melakukannya, saya menemukan HTML Purifier yang mungkin Anda inginkan. Tapi yang jelas karena ini dalam PHP dan bukan Perl, saya tidak benar-benar mengujinya.

Selain itu, dalam penelitian saya, saya sampai pada kesimpulan bahwa ini adalah bisnis yang sangat rumit dan mempertimbangkan jika memungkinkan menggunakan bahasa markup yang disederhanakan seperti Markdown, seperti yang disarankan oleh Hank Gay.

person FalseVinylShrub    schedule 05.05.2010

Jika Anda familiar dengan ASP .NET, jalankan saja Server.htmlencode() untuk mengonversi karakter khusus seperti ‹ > menjadi "& g t;" "< ;"

Di php, Anda dapat menggunakan fungsi htmlspecialchars().

Setelah karakter khusus dikodekan, skrip lintas situs dapat dicegah.

person TechTravelThink    schedule 05.05.2010
comment
Tapi itu menonaktifkan html, saya ingin mengizinkan html tetapi menghapus tag berbahaya seperti iframe dan skrip. - person Martin; 05.05.2010
comment
Kemudian gunakan markup yang dirancang khusus untuk tujuan tersebut seperti bbcode atau wikicode dan editor yang sesuai. - person symcbean; 05.05.2010