it-swarm-tr.com

Markdown'u güvenli bir şekilde nasıl kullanırım?

Markdown kütüphanesini nasıl güvenle kullanabilirim? Çıktısının web sayfama eklenmesini sağlamak için ne yapmam gerekir?

Güvenilmeyen kullanıcıların içerik girmesine izin vermek istiyorum (Markdown biçiminde). HTML oluşturmak için Markdown işlemcisini kullanacağım ve bu HTML'yi web sayfama eklemek istiyorum. Bunun güvenli olduğundan ve kendine özgü bir XSS güvenlik açığı olmadığından emin olmak için ne yapmam gerekir? Hangi tartışmaları geçmem gerekiyor? Yapmam gereken herhangi bir ön işleme veya son işleme var mı? Eğer ilgili ise python-markdown kütüphanesini kullanıyorum.

45
D.W.

Markdown tek başına çıktıyı santralize etmek için yeterli olmaz, çünkü keyfi HTML/Javascript girişine izin verir ve sadece işlenmeden geçirir.

Örneğin. bu geçerli bir etikettir:

## heading

text

Ama aynı zamanda bu:

## heading

text <script>alert('hello');</script>

işaretleme sözdizimi sayfasından :

Markdown’ın sözdizimi kapsamında olmayan herhangi bir biçimlendirme için HTML'nin kendisini kullanmanız yeterlidir. Markdown'dan HTML'ye geçiş yaptığınızı belirtmek için önceden yazmanıza veya sınırlandırmanıza gerek yoktur; sadece etiketleri kullanırsınız.

Sadece python-markdown kullanarak hızlı bir test yaptım ve bu şekilde çalışıyor gibi görünüyor.

Bununla birlikte, işaretleme sözdizimi tarafından kullanılan sınırlı karakter kümesi göz önüne alındığında, kullanıcıların beslemeden önce beslemenize izin verdiğiniz karakter kümesine filtre uygulamak daha kolay olabilir işaretlemek için (örneğin, a-zA-Z* #+:/&?=-_()> gibi bir şey), ancak bunlar bile, onu ayrıştıran/kodlayan bazı kodları karıştırmak için yeterli olabilir ... Bu yüzden, gerçekte ne kadar güvenlik aldığınızdan emin değilim. markdown kullanıyorsunuz.

GÜNCELLEME:

daha fazla araştırma üzerine ben SO bu cevabı buldum oldukça mantıklı görünüyor.

Daha sonra daha da araştırdım ve safe_mode Anahtarını keşfettim ( burada bahsedildi ve burada ).

Hızlı bir test oldukça iyi çalışıyor gibi görünüyor, ancak daha fazla araştırmayı hak edebilir ...

>>> import markdown
>>> markdown.markdown("<script>alert('hello');</script> hello <strong>world</strong>")
u"<script>alert('hello');</script>\n\n<p>hello <strong>world</strong></p>"
>>> markdown.markdown("<script>alert('hello');</script> hello <strong>world</strong>", safe_mode=True)
u'<p>[HTML_REMOVED]</p>\n<p>hello [HTML_REMOVED]world[HTML_REMOVED]</p>'

Safe_mode için tam seçenek ayarlandı belge sayfasında mevcuttur - güvenlik için enable_attributes Öğesinin False olarak ayarlandığından da bahsedilir.

13
Yoav Aner