Bir müşteri web sitesinde Zengin Metin Düzenlemesi gerektirdiğinde ne yaparsınız?


18

Hepimizin bildiği gibi, XSS saldırıları tehlikelidir ve çekilmesi gerçekten kolaydır . ASP.NET MVC'nin yaptığı gibi çeşitli çerçeveler HTML kodlamayı kolaylaştırır:

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

Ancak, müşteriniz içeriklerini doğrudan bir Microsoft Word belgesinden yükleyebilmesini isterse ne olur?

İşte senaryo: İnsanlar Microsoft Word'deki içeriği kopyalayıp bir WYSIWYG düzenleyicisine (bu durumda tinyMCE ) yapıştırabilir ve sonra bu bilgiler bir web sayfasına gönderilebilir.

Web sitesi herkese açık, ancak yalnızca bu kuruluşun üyeleri bir web sayfasına bilgi gönderme erişimine sahip olacak.

Bu gereksinimleri nasıl güvenli bir şekilde ele alabilirim? Şu anda müşterinin gönderdiği mesajlar üzerinde hiçbir kontrol yapılmadı (yalnızca 'güvenilir' kullanıcılar gönderebildiğinden), ancak bundan özellikle memnun değilim ve bir hesabın saldırıya uğraması durumunda daha fazla kilitlemek istiyorum.

Bu gereksinimleri karşıladığının farkında olduğum tek kavramsal yöntem HTML etiketlerini beyaz listeye eklemek ve bunların geçmesine izin vermektir . Başka bir yol var mı? Değilse, Kullanıcının Veritabanında herhangi bir biçimde veri depolamasına izin vermenin güvenli bir yolu nedir, ancak yalnızca doğru etiketlenmiş ve bozuk etiketlerden arındırılmış olarak görüntülenmesi nedir?

İlgili soru

Siteler Arası Komut Dosyalarını Önleme (XSS)


Güzel bir soru- burada da benzer bir soru var- stackoverflow.com/questions/445177/…
var- RichardOD

Kabul. Bu benzer, ancak kafa karıştırıcı bir soru (Soru bulmak zor) ve özellikle başka bir yol olup olmadığını sormuyor. Beyaz Liste'ye gerek kalmadan HTML oluşturmanın başka bir yolu varsa, ben bununla ilgiliyim. Bununla ilgilenen bir ASP.NET MVC View Engine varsa, bunu bilmek de iyidir.
George Stocker

Güvenlikle ilgili olmayan bir notta, etiketlerin filtrelenmesi büyük olasılıkla bir kullanıcı arayüzü açısından yararlı olacaktır. Yanlışlıkla bir açılı ayraç yazmak ve kaçmayı unutmak çok kolaydır. Word'den kopyalayan kullanıcılar hakkında konuştuğumuzdan, kötü etiketlere benzeyen şeyleri yakalamak ve bunları uygun şekilde kodlamak (yani & amp; lt;), böylece İşlerin İyi Olması iyi bir fikirdir.

4. noktaya gelince: Bahse girerim hala bir sorun var! Sonuçta çoğu hack bir iç iştir. Belirli bir editör için, FreeTextBox ancak gereksinimlerinizle, özellikle MVC ile ne kadar iyi eşleştiğini konuşamıyorum.
Joel Coehoorn

1
@gnat Teşekkürler; düzenlendi. Görünüşe göre sorum bir tür kabalın dikkatini çekti; hızlı bir şekilde arka arkaya üç downvotes ve koruma ve düzenleme isteğiniz.
George Stocker

Yanıtlar:


8

(Bir geliştirici olarak sizin için) en kolay yolu birçok varyasyonu birini uygulamaya muhtemelen Markdown örneğin Markdown.NET , ya da daha iyi (IMHO) dmw-editörü .

Ardından, kullanıcılarınız basit HTML yapıştırabilir, ancak tehlikeli bir şey olmaz ve girilen verilerini önizleyebilir ve yayınlamadan önce bile herhangi bir karışıklığı düzeltebilir ...


StackOverflow'un WMD sözdizimine gerek olmadan özel bir editör kullandığına inanıyorum
Jon


WMD sözdizimi ile ne demek istiyorsun? Anlayabildiğim kadarıyla, tüm WMD sözdizimi çalışır. Ve henüz çalışmayan bir şey bulamadım ...

2
Markdown kullanmayla ilgili sorun, markdown'un rastgele HTML'ye izin vermesidir; kendi başına bir çözüm değildir.
George Stocker

7

Beyaz liste, kullanıcıların doğrudan veya bir Zengin Metin Düzenleyicisi kullanarak HTML girmesine izin verirken XSS saldırılarını önlemenin en iyi yoludur.

Diğer sorularınız hakkında:

Anında beyaz listeye ekleme yeteneğini içeren bir WYSIWYG editörü var mı?

Bunun işe yarayacağını sanmıyorum. Bunun için sunucu tarafı koduna ihtiyacınız vardır ve RTE istemcide çalışır.

TinyMCE isterseniz etiketleri filtreler, ancak bu tarayıcıda gerçekleştiği için buna güvenemezsiniz. Bkz extended_valid_elements . TinyMCE (Moxie) de beyaz listeyi önerir, buraya bakın .

Sadece 'özel ilan' için olacağından endişelenmeli miyim

Belirli olmayan nedenler (çok nadir) olmadığı sürece HTML'yi her zaman filtrelemeniz gerekir. Bazı nedenler: a) bugün dahili kullanıcılar için olan işlev, belki yarın halk için) b) yetkisiz erişimin daha az etkisi olacaktır

herhangi bir biçimde veritabanında depolamak için izin vermenin en iyi yolu, ancak yalnızca düzgün kodlanmış ve kötü etiketlerden sıyırılmış görüntülemek?

Ben bunu tercih ederim. Çeşitli nedenlerle veritabanına eklemeden önce kullanıcı girişini değiştirmek istemiyorum.


-1

Ben de aynı şeyi yapıyorum. TinyMCE kullanıyorum ve Word belgelerinden yapıştırmaya izin veriyorum. Yalnızca siteyi koruyan belirli kişiler bunu bir yönetici alanı aracılığıyla yapabilir. Bu ASP.Net Üyeliği tarafından güvence altına alınmıştır. Genel siteye gönderildiğinde HTML.Encode yapıyorum basit.

İsterseniz veritabanına koymadan önce aşağıdaki kodu kullanabilirsiniz, ancak hangi vuruşun sizi etkileyeceğinden emin değilsiniz. Beyaz listenizle gitmeniz gerekebilir.

 /// <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;
    }

<script> alert ("hey") </script> gibi bir metin saklarlarsa ve Html.Encode (<script> alert ("hey") </script>) yaparsanız, yalnızca uyarı
Jon

Beyaz liste kullanmıyorum, sadece olduğu gibi saklıyorum. Yukarıdaki fonksiyon yardımcı olabilir ama ne vurmak etkiler olacak bilmiyorum. Ne karar verdiğini bilmek istiyorum. Gönderim neden negatif olarak işaretlendi?
Jon

1
Sanırım bunun nedeni yazılımınızın bunu yapma şeklinin çok naif bir uygulama olması; uygulamanızın etrafında dolaşacak her türlü hile vardır.
George Stocker

4
Bir beyaz liste iyi bir fikirdir, ancak yönteminiz kesinlikle değildir. Regex, HTML'nin oldukça gizlenmiş olabileceği için metindeki etiketleri tespit etmenin güvenilir bir yolu değildir. HTML Çeviklik Paketi gibi bir kitaplığı kullanmak çok daha iyi.
Noldorin

-1

Seçeneklerden biri .NET için HTML Düzenleme Denetimi (yazdığım) olabilir.

.NET için yalnızca HTML öğelerinin bir alt kümesini destekleyen bir WYSIWYM HTML düzenleyicisidir hariç <script>: bu şekilde bir beyaz liste görevi görür.

Dahili kullanım içinse (yani bir intranet sitesi), kontrol bir web sayfasına gömülebilir .

Word'den yapıştırma desteği entegre etmedim, ancak bu yönde bir adım olan bir bileşenim var: Doc to HTML converter ; Bu yüzden, bir dokümanı HTML'ye dönüştürmek, HTML'yi düzenleyicide görüntülemek için ASP.NET'te kullanabileceğiniz yapı taşları var.


-2

IMHO'm herkese açık olana kadar kullanıcılarınıza güvenmeye devam ediyor.

İhtiyaçlarınızı karşılamanın güvenilir bir yolu yoktur. Örneğin, herhangi bir WYSIWYG düzenleyicisi, URL ekleyen görüntüleri (dolaylı kullanım parçası, yasa dışı içerik) veya metinle (geçersiz metin, yanlış yazılmış metin, yanlış boyutlandırılmış metin) koruyamaz.

Benim açımdan, kullanıcılarınıza güvenebiliyorsanız, her şeye izin vermeniz yeterlidir, sadece tehlikeli hatalar BİLİNİYOR (kullanıcıları hatalardan korumak için).

Güvenmiyorsanız, bir tür özel işaretleme kullanın (örn. İşaretleme).

Projemde potansiyel olarak tehlikeli içerik için özel türler ve bu tür içeriği oluşturmak ve kabul etmek için özel yöntemler kullanıyoruz. Bu kodun iplik modelimizde yüksek işareti vardır ve buna çok dikkat edilir (örneğin her değişiklik iki bağımsız kodlayıcı tarafından gözden geçirilmelidir, kapsamlı test paketimiz vb.).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.