2010-09-20 22 views
9

XSS'ye karşı ilk savunma hattı olarak bir düzenli ifadeye sahibim.XSS'ye karşı ilk savunma hattı olarak Regex

public static function standard_text($str) 
{ 
    // pL matches letters 
    // pN matches numbers 
    // pZ matches whitespace 
    // pPc matches underscores 
    // pPd matches dashes 
    // pPo matches normal puncuation 
    return (bool) preg_match('/^[\pL\pN\pZ\p{Pc}\p{Pd}\p{Po}]++$/uD', (string) $str); 
} 

Aslında Kohana 2.3'dan.

Bu, herkese açık metinle (hiç HTML olmadan) çalışır ve bu sınama başarısız olursa girişi reddeder. Metin her zaman htmlspecialchars() (veya daha özel olarak Kohana's flavour ile görüntülenir, diğer şeylerin arasında char kümesini ekler). Ayrıca çıkışta bir strip_tags() koydum.

İstemci, parantez içinde bir metin girmek istediğinde sorun yaşadı. Yardımcıyı değiştirmeyi ya da genişletmeyi düşündüm, ama aynı zamanda ikincil bir düşüncem de vardı - eğer çift alıntıya izin verirsem, gerçekten doğrulamam gereken herhangi bir neden var mı?

Çıkışta kaçışa güvenebilir miyim?

cevap

5

Tehlikeli XSS saldırılarını filtrelemek için Regex'lere güvenmek asla güvenli değildir. Onlara güvenmemenize rağmen, çıkış kaçağı ve giriş filtrelemesi doğru kullanıldığında her türlü saldırıyı ortadan kaldıracaktır. Bu nedenle, Regex'lerin yardımlarının gerçekten gerekli olmadığı durumlarda “ilk savunma hattı” olmasının hiçbir anlamı yoktur. Siz ve müşteriniz keşfettikçe, sadece böyle kullanıldığında işleri karmaşıklaştırırlar.

Uzun lafın kısası: html_entities veya htmlspecialchars'u çıktınızdan çıkarırsanız, regeekslere ihtiyacınız yoktur ve gerçekten strip_tags'a da gereksinim duyarsınız.