Apa yang Anda lakukan ketika klien memerlukan Editing Teks Kaya di situs web mereka?

18

Seperti yang kita ketahui sekarang, serangan XSS berbahaya dan sangat mudah dilakukan . Berbagai kerangka membuatnya mudah untuk menyandikan HTML, seperti ASP.NET MVC tidak:

<%= Html.Encode("string"); %>

Tetapi apa yang terjadi ketika klien Anda mengharuskan mereka untuk dapat mengunggah konten mereka langsung dari dokumen Microsoft Word?

Berikut skenarionya: Orang-orang dapat menyalin dan menempelkan konten dari Microsoft word ke editor WYSIWYG (dalam hal ini tinyMCE ), dan kemudian informasi tersebut diposting ke halaman web.

Situs web bersifat publik, tetapi hanya anggota organisasi yang akan memiliki akses untuk mengirim informasi ke laman web.

Bagaimana cara menangani persyaratan ini dengan cara yang aman? Saat ini tidak ada pengecekan yang dilakukan atas apa yang diposkan klien (karena hanya pengguna 'tepercaya' yang dapat memposting), tetapi saya tidak terlalu senang dengan itu dan ingin menguncinya lebih lanjut jika seandainya akun diretas.

Satu-satunya metode konseptual yang saya ketahui memenuhi persyaratan ini adalah dengan memasukkan tag HTML daftar putih dan membiarkannya melewatinya . Apakah ada cara lain? Jika tidak, Apa cara aman untuk membiarkan pengguna menyimpan input dalam Database dalam bentuk apa pun, tetapi hanya menampilkannya dengan benar dan dilucuti dari tag buruk?

Pertanyaan terkait

Mencegah Cross Site Scripting (XSS)

George Stocker
sumber
Pertanyaan yang bagus - di sini adalah yang serupa though- stackoverflow.com/questions/445177
269
Sepakat. Itu mirip, tetapi ini adalah pertanyaan yang membingungkan (Pertanyaan itu sulit ditemukan), dan tidak secara khusus menanyakan apakah ada cara lain. Jika ada cara lain untuk membuat HTML tanpa harus daftar putih, saya semua tentang itu. Jika ada ASP.NET MVC View Engine yang menangani ini, itu baik untuk diketahui juga.
George Stocker
Pada catatan terkait non-keamanan, tag pemfilteran mungkin akan membantu dari perspektif antarmuka pengguna. Sangat mudah untuk secara tidak sengaja mengetikkan braket sudut dan lupa untuk menghindarinya. Karena kita sedang berbicara tentang pengguna yang menyalin dari Word, itu ide yang baik untuk menangkap apa yang tampak seperti tag buruk dan menyandikannya dengan tepat (yaitu & amp; lt;) sehingga hal-hal Just Work.
Mengenai poin # 4: Anda bertaruh itu masih menjadi masalah! Lagipula, kebanyakan peretasan adalah pekerjaan orang dalam. Untuk editor tertentu, saya sudah beruntung menggunakan FreeTextBox tapi saya tidak bisa bicara seberapa baik itu sesuai dengan kebutuhan Anda, terutama MVC.
Joel Coehoorn
1
@gnat Terima kasih; diedit. Sepertinya pertanyaan saya mendapat perhatian dari beberapa komplotan rahasia; tiga downvotes berturut-turut, dan perlindungan dan edit permintaan Anda.
George Stocker

Jawaban:

8

Cara termudah (untuk Anda sebagai pengembang) mungkin untuk menerapkan salah satu dari banyak variasi Markdown , misalnya Markdown.NET atau, lebih baik lagi (imho), wmd-editor .

Kemudian, pengguna Anda dapat menempelkan HTML sederhana, tetapi tidak berbahaya, dan mereka dapat mempratinjau data yang dimasukkan dan meluruskan segala gangguan bahkan sebelum memposting ...

Tomas Aschan
sumber
Saya percaya StackOverflow menggunakan editor khusus tanpa perlu sintaks WMD
Jon
Apa yang Anda maksud dengan sintaks WMD? Sejauh yang saya tahu, semua sintaks WMD berfungsi. Dan saya belum menemukan sesuatu yang tidak berhasil ...
2
Masalah dengan menggunakan Markdown adalah bahwa penurunan harga memungkinkan HTML sewenang-wenang; jadi dengan sendirinya itu bukan solusi.
George Stocker
7

Daftar putih memang cara terbaik untuk mencegah serangan XSS ketika memungkinkan pengguna untuk memasukkan HTML, baik secara langsung atau menggunakan Rich Text Editor.

Tentang pertanyaan Anda yang lain:

Apakah ada editor WYSIWYG yang menyertakan kemampuan untuk masuk daftar putih dengan cepat?

Saya tidak berpikir ini bisa berhasil. Anda memerlukan kode sisi server untuk ini dan RTE berjalan pada klien.

TinyMCE memfilter tag jika Anda mau, tetapi karena ini terjadi di browser, Anda tidak dapat mempercayainya. Lihat extended_valid_elements . TinyMCE (Moxie) juga menyarankan masuk daftar putih, lihat di sini .

Haruskah saya khawatir tentang ini karena hanya akan untuk 'posting pribadi'

Anda harus selalu memfilter HTML kecuali ada alasan khusus untuk tidak (sangat jarang). Beberapa alasan: a) fungsionalitas yang untuk pengguna internal hari ini mungkin untuk publik besok b) akses yang tidak sah akan memiliki dampak yang lebih kecil

apakah cara terbaik untuk membiarkan mereka menyimpannya di Database dalam bentuk apa pun, tetapi hanya menampilkannya dengan benar dan dilucuti dari tag buruk?

Itulah yang saya inginkan. Saya tidak suka mengubah input pengguna sebelum memasukkan ke dalam database karena berbagai alasan.

daremon
sumber
-1

Saya melakukan hal yang sama. Saya menggunakan TinyMCE dan memungkinkan menempelkan dari dokumen Word. Hanya orang-orang tertentu yang mengelola situs yang dapat melakukan ini melalui area admin. Ini dijamin oleh Keanggotaan ASP.Net. Saya sederhana melakukan HTML. Masukkan kode ketika dikirim ke situs umum.

Anda dapat menggunakan kode di bawah ini jika Anda suka sebelum dimasukkan ke dalam basis data tetapi tidak yakin apa yang mempengaruhi itu akan memberi Anda. Anda mungkin harus pergi dengan daftar putih Anda.

 /// <summary>
    /// Strip HTML
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string StripHTML(string str)
    {
        //Strips the HTML tags from strHTML 
        System.Text.RegularExpressions.Regex objRegExp = new System.Text.RegularExpressions.Regex("<(.|\n)+?>");

        // Replace all tags with a space, otherwise words either side 
        // of a tag might be concatenated 
        string strOutput = objRegExp.Replace(str, " ");

        // Replace all < and > with < and > 
        strOutput = strOutput.Replace("<", "<");
        strOutput = strOutput.Replace(">", ">");

        return strOutput;
    }
Jon
sumber
Jika mereka menyimpan teks seperti <script> lansiran ("hey") </script> dan Anda melakukan Html. Kode sandi (<script> lansiran ("hey") </script>) hanya akan mencetaknya agar halaman tidak menjalankan alert
Jon
Saya tidak menggunakan daftar putih, saya hanya menyimpannya apa adanya. Fungsi di atas bisa membantu tetapi saya tidak tahu apa yang mempengaruhi itu akan mempengaruhi. Ingin tahu apa yang Anda putuskan. Mengapa pos saya ditandai sebagai negatif?
Jon
1
Saya kira itu karena cara perangkat lunak Anda melakukannya adalah implementasi yang sangat naif; ada segala macam trik yang akan menyiasati implementasi Anda.
George Stocker
4
Daftar putih adalah ide yang bagus, tetapi metode Anda tentu saja tidak. Regex bukan cara yang andal untuk mendeteksi tag dalam teks, karena HTML bisa menjadi sangat membingungkan. Jauh lebih baik menggunakan perpustakaan seperti Paket Agility HTML.
Noldorin
-1

Salah satu opsi mungkin Kontrol Edit HTML untuk .NET (yang saya tulis).

Ini adalah editor HTML WYSIWYM untuk .NET, yang hanya mendukung subset elemen HTML , tidak termasuk <script>elemen: jadi dengan cara itu berfungsi sebagai daftar putih.

Jika itu untuk penggunaan internal (yaitu situs intranet), maka kontrol dapat disematkan di halaman web .

Saya belum mengintegrasikan dukungan untuk menempelkan dari Word, tetapi saya memiliki komponen yang merupakan langkah ke arah itu: konverter Doc to HTML ; jadi saya memiliki blok bangunan yang dapat Anda gunakan di ASP.NET untuk mengonversi Doc menjadi HTML, menampilkan HTML di editor, dll.

ChrisW
sumber
-2

IMHO saya terus mempercayai pengguna Anda sampai Anda akan go public.

Ya, tidak ada cara yang dapat diandalkan untuk mencapai kebutuhan Anda. Misalnya setiap editor WYSIWYG gagal melindungi formulir memasukkan gambar dengan URL (trek penggunaan tidak langsung, konten ilegal) atau teks (teks ilegal, teks salah eja, teks missized).

Pandangan saya adalah bahwa jika Anda dapat mempercayai pengguna Anda, cukup izinkan semuanya, cukup beri tahu pengguna jika ada TAHU markup berbahaya (untuk menjaga mereka dari kesalahan).

Jika Anda tidak percaya, gunakan semacam markup khusus (mis. Penurunan harga).

Dalam proyek saya, kami menggunakan tipe khusus untuk konten yang berpotensi berbahaya dan metode khusus untuk merender dan menerima konten tersebut. Kode ini memiliki nilai tinggi dalam model utas kami dan perhatiannya sangat tinggi (misalnya setiap perubahan harus ditinjau oleh dua coders independen, kami memiliki rangkaian uji komprehensif dan sebagainya).

Mike Chaliy
sumber