Kullanıcı Girişi PHP filtreleme

3 Cevap php

Şu mesajları ve sitede görüntülenen yorum göndermek kullanıcıların gerektiren bir uygulama üzerinde çalışıyorum. Hepimizin kullanıcı girişi yüzden güvenilir olamaz biliyorum ben kullanıcının mesajları ve yorumlar işlemek için ($ dize, ENT_QUOTES) htmlspecialchars kullanılır.

Şimdi, ben bazı bazı HTML etiketleri göz ardı istiyorum. gibi <b><br /> ve birkaç etiketleri. O diğerlerini filtreler ise htmlspecialchars'ın bazı etiketleri görmezden ki ben bunu nasıl yapabilirim.

3 Cevap

Bu betik enjeksiyonu veya benzeri herhangi bir olasılığı izin olmaksızın sadece bazı HTML etiketleri izin very, very difficult olduğunu.

Ben aslında bu kaçınarak ve bu this UBB code parser (veya benzeri) olarak HTML üretir bir şey kullanarak öneriyoruz. Hatta Markdown (HTML seçeneği kapalı olan).

Saldırganlar kamu bakan ise çok önemlidir sitenizi vurmak için hiçbir kapsam verir.

Hatta bazı HTML aracılığıyla izin verirseniz, büyük ihtimalle kararlı bir saldırganın bu yuvarlak bir yolunu bulacaksınız vardır.

Yeniden takın izin etiketleri için alıntı dize değiştirebilirsiniz. Örneğin <b> etiketler:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);

Ben sadece çok farklı, tam etiketleri mümkün olduğunca güvenli olmasını sağlayacak. Yani Eğer, çok pis böcek yol açabilir için yoksa normal ifadeler kullanmayın.

Bu kadar basit değil gibi olabilir şey, çünkü ne htmlspecialchars() nor htmlentities() provides any options to ignore certain tags (both functions don't even know the meaning of the notion of tags).

Sen kullanıcıları örn, onların mesajları biçimlendirmek için izin vermek için bazı başka yollarla kullanabilirsiniz BBCode, Textile ya da Markdown. Hepsi için mevcut PHP ayrıştırıcılarda vardır.

Eğer html etiketleri ile sopa gerekir Eğer onlar htmlspecialchars() . You can then postprocess the result to change back the format to normal HTML-tags. The following sample visualizes this process for a simple <a>-etiketi etkilenmez olmayacak şekilde izin etiketlerini formatlar bazı önişlemesini çare olabilir. Düzenli ifadeler ile HTML işleme hata eğilimli ve gitmek için her zaman bir yol olduğunu unutmayın - Ben sadece bu örnekte basitlik uğruna bunu kullanacağız.

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);

Bu denenmemiş ve kesinlikle çok daha fazla iş gerektirir.