Real escape string

Spet imam problem zato se obračam na vas :)

Naredil sem formo za registracijo uporabnika, podatke pa vpisujem v MSSQL.
Skrbi pa me varnost.
Kaj uporabit namesto mysqlrealescape_string?

Hvala

20 odgovorov

nextgen: Hvala, ravno preizkušam :)
Malo sem pobrskal še po digitalpoint forumu in našel tole. Zanima me še vaše mnenje.

function mssql_escape_string($data) {
    if(!isset($data) or empty($data)) return '';
    if(is_numeric($data)) return $data;
    $non_displayables = array(
        '/%0[0-8bcef]/',        
        '/%1[0-9a-f]/',
        '/[\x00-\x08]/',    
        '/\x0b/',           
        '/\x0c/',               
        '/[\x0e-\x1f]/' 
    );
    foreach($non_displayables as $regex)
        $data = preg_replace($regex,'',$data);
        $data = str_replace("'","''",$data);
    return $data;
}

Weby:

function mssql_escape_string($data) {
  $non_displayables = array(
      '/%0[0-8bcef]/',        
      '/%1[0-9a-f]/',
      '/[\x00-\x08]/',    
      '/\x0b/',           
      '/\x0c/',               
      '/[\x0e-\x1f]/' 
  );
}

Tale del zna delati tezave z UTF-8 znaki. Tako da bodi previden.

1

Potem ti pa svetujem tole predelano alernativo:

  1. Inicializiraj $novString;
  2. Beri znak po znak z mb_substr(), shrani v $c
  3. Če je ta znak strlen($c)==1 (enobiten), potem poglej, če ord($c) matcha katero izmed escape sequenc.
  4. Če ne, potem ga dodaj v $novString.=$c.
  5. Če je $c==" ' ", potem$novString.=" ' ' " (odstrani presledke, dal sem jih zaradi berljivosti)

V tem primeru pridobiš na UTF-8 podpori in se izogneš regex "čungalungam". V točki 3. lahko dodaš podporo tudi za večbitne non-printable znake, vendar Weby-eva funkcija tako ali tako tega ne dela.

technolog: Hvala, bomo sprobali :)

Do sedaj sem se igral z PDO in nastalo je tole

try{
$pquery=$db->prepare('SELECT test FROM test WHERE test = :name');
$pquery->execute(array(
':name'=>$_POST['name']
));
while ($result = $pquery->fetchObject()) {
echo $result->test;
echo "<br />";
}

}catch(PDOException $e) {
echo 'Error : '.$e->getMessage();
exit();
}

Bo takole v redu ali je treba še kakšno zadevo dodati oz. spremenit?

Error check. Kaj se zgodi, ce $_POST['name'] ne obstaja?

No, tudi če ne, se ne bo svet podrl.

technolog:
No, tudi če ne, se ne bo svet podrl.

V tem primeru bi me bilo groza uporabljati tvojo kodo.
Ce ne zaradi drugih razlogov, nebi hotel imeti v logu miljon E_NOTICE-ov.

No, jasno, ampak varnostna luknja pa to ni.

technolog:
No, jasno, ampak varnostna luknja pa to ni.

Zanic izgovor za pisanje zanic kode. Kar nekaj delodajalcev, s katerimi sem delal bi te odpustilo zaradi takega argumenta.
Ali pisi dobro kodo ali jo pa sploh ne.

Lej... Tudi če to pozabiš napisat in se zgodi, da ne bo ideksa "name" v POST, boš pač dobil vrstico v log. To boš kasneje videl in popravil.

Kar sem hotel povedat - ne zagovarjam da spuščaš take checke, ampak v primeru, da se ti zgodi, da spregledaš, ne bo resne nevarnosti za aplikacijo.

Seveda privzemam, da imaš prikaz napak v produkciji izklopljen, kar je pri meni vedno, pač absolutni minimum.