PHP Kullanıcı Tedarik Düzenli ifadeler Sanitasyon

5 Cevap php

Kullanıcıların düzenli ifadeler test edebilirsiniz bir web sitesi oluşturmak istiyorsanız (birçok bunun gibi ... zaten orada var: http://www.pagecolumn.com/tool/pregtest.htm). Temelde, kullanıcı normal bir ifade ve bazı örnek metni sağlamaktadır ve regex değerlendirme sonuçları geri tükürmek olacak.

Ben PHP "preg_ *" fonksiyonları ile sunucu tarafında regex değerlendirmek istiyorum. Verilen regex sterilize bir yolu var mı? Ben endişe olmalı güvenlik açıkları nelerdir?

5 Cevap

I think PHP itself will check the regex. Here's a sample script I made :

// check for input, and set max size of input
if(@!empty($_POST['regex'])
    && @!empty($_POST['text'])
    && strlen($_POST['regex'])<1000
    && strlen($_POST['text'])<2000
    ){
    // set script timeout in case something goes wrong (SAFE MODE must be OFF)
    $old_time=ini_get('max_execution_time');
    if(!set_time_limit(1)) die('SAFE MODE MUST BE OFF'); // 1 sec is more then enough

    // trim input, it's up to you to do more checks
    $regex=trim($_POST['regex']);
    // don't trim the text, it can be needed
    $input=$_POST['text'];
    // escape slashes
    $regex=preg_replace('/([\\/]+)?//', '\/', $regex);

    // go for the regex
    if(false===$matched=@preg_match('/'.$regex.'/', $input, $matches)){
            // regex was tested, show results
            echo 'Matches: '.$matched.'<br />';
            if($matched>0){
                    echo 'matches: <br />';
                    foreach($matches as $i =>  $match){
                            echo $i.' = '.$match.'<br />';
                }
            }
    }
    // set back original execution time
    set_time_limit($old_time);
}

Her neyse, NEVER EVER use eval() with user submitted strings.

Ayrıca, bazı basit, minimalist sanitizasyonunun yapabilir, ama bu size kalmış. ;)

Aklıma tek sorun birisi DOS size kötü bir regex (O (2 ^ n) ya da O (n!) ya da ne olursa olsun bir), ve önlemek için en kolay yolu girerek bu ayarlamak için olabilir olmasıdır sizin sayfa zaman aşımı kısa.

Regex bir veritabanında saklanır ediliyor ise, normalde bu tür hazırlanmış deyimleri gibi verileri, kaçmak için kullandıkları her türlü yöntem kullanmalısınız.

Aksi takdirde, benim tek endişe kullanıcı bir mischeviously karmaşık regex içerebilir bu anlamda kötü niyetli regex kaynağı olabilir, ve ben o kontrol etmek için bir yol olduğundan emin değilim ki.

Bir düşünce JS bunu yaparak tüm istemci tarafı sizin regex değerlendirici yapabilir olduğunu, ancak php gebelik fonksiyonları ve JavaScript regex fonksiyonları arasında tutarsızlık vardır.

Kullanıcı kaynaklı İfadelerinin değerlendirmek için çalışırken Afaik "güvenlik açıkları" şimdi vardır. Belki olabilirdi kötü şey - erik işaret gibi - komut dosyası içinde bir DOS saldırı ya da ölümcül hata.

Ben (hatta teorik olarak) orada her olası regexpi "sterilize" mümkün olmayacağını söylemek için korkuyorum. Yapabileceğiniz en iyi sözcük ve / veya sözdizimsel hataları kontrol etmektir.