Dar vieno analitiko svetainė

Petras Kudaras

Pagerintas register_globals?

Žaidžiuosi dabar per atostogas šiek tiek su Perl ir PHP ;) Ypač man
Perle patinka „taint mode“, kuris tiesiog neleidžia naudoti
kintamųjų, gautų iš išorinės aplinkos – ar tai būtų per shellą
gauti kintamieji, ar GET/POST/COOKIE HTTP metodais gauti duomenys. PHP
šiuo atžvilgiu tik dabar susirūpino šiais dalykais (register_globals gi
būdavo On iki 4.2.0 versijos). O jeigu pasirašius savą
register_globals atitikmenį? Štai kas man gavosi:

<?php
    define("USE_GET", 1);
    define("USE_POST", 2);
    define("USE_COOKIE", 4);

    $USE_TYPE = array( 'integer' => '/(^\d+$)/',
               'hexstring' => '/(^[0-9A-Fa-f]+$)/',
               'raw' => '/(.*)/s');

    function use_variable($var, $regexp = 'raw', $source = 7)
    {
        if($regexp[0] !== '/') {
            global $USE_TYPE;
            $regexp = $USE_TYPE[$regexp];
        }
        if ($source & USE_GET) {
            preg_match($regexp, $_GET[$var], $o);
        } elseif ($source & USE_POST) {
            preg_match($regexp, $_POST[$var], $o);
        } elseif ($source & USE_COOKIE) {
            preg_match($regexp, $_COOKIE[$var], $o);
        }
        global $$var;
        $$var = $o[1];
    }

    use_variable('skaitmuo', 'integer');
    use_variable('skaitmuoblogas', 'integer');
    use_variable('hexas', 'hexstring');
    use_variable('hexasperpost', 'hexstring', USE_POST);
   
    print "Skaitmuo: $skaitmuo<br>";
    print "Skaitmuoblogas: $skaitmuoblogas<br>";
    print "Hexas: $hexas<br>";
    print "Hexasperpost: $hexasperpost<br>";
?>

Funkcija use_variable() „išvalo“
kintamuosius prieš padarydama juos globaliais. Tad jei kas bandys
padaryt kokią nors XSS ar SQL injection ataką, duomenys turėtų
būti geriau atsijojami. Na, bent jau teoriškai. Vat išsaugojus šį kodą
byloje test.php ir nuėjus adresu
test.php?skaitmuo=123&skaitmuoblogas=123a&hexas=123465789abCDE&hexasperpost=12346789A
turėtų spausdinti tik gerus dalykus ;)