[ alfa-pro @ 17.07.2013. 19:46 ] @
Zvuci smesno ali istinito, malo sam se ovih dana pozabavio sa SQL Injection da vidim kako to radi jer ako znam kako to radi lakse cu znati da zastitim svoje aplikacije.
Da moderatori nepomisle da zelim nekog da hakujem iskreno to mene nezanima.

Do sada sam koristio mysql_real_escape_string, get_magic_quotes_gpc da bi zastitio svoje upite...

E sada ja sam malo vise istrazivao i napravio sam simple formu za logovanje i php fajl koji proverava da li korisnik postoji ili ne u bazi...

Citajuci na php.net i po googe-u kako se zastiti i kako izgleda napad ja sam taj primer primenio na svoju app i neradi...

Code:

    $name = $_POST['name'];
    $pass = $_POST['pass'];
    
    if ($name =='' OR $pass == '')  {
        die("Unesi username or password!");  
    }
    else {      
          $q = mysql_query("SELECT * FROM users WHERE name= '$name'  AND pass = '$pass'") OR die(mysql_error());    
          if(mysql_num_rows($q)) {
              echo 'You are loged...';        
          }else {
              echo 'Korisnik nepostoji...';
          }
    }


Radi ako direktno u kodu dodam OR 1 ili OR 1=1
Code:
$q = mysql_query("SELECT * FROM users WHERE name= '$name'  AND pass = '$pass'" OR 1=1) OR die(mysql_error());   


Ali na php sajtu sam citao da ako korisnik unese u polje username administrator <postojeci clan> i kao sifru unese ' OR 1=1' da ce MySQL vratiti TRUE i uspesno logovanje.

Ja kad unesem u password polje to sto su rekli dobijam :

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

Probao sam na 100 nacina i dalje isto. Zasto bi onda brinuli o ovome kada sam sql vraca gresku i gubili brdo vremena na ciscenje stringova itd...
Ja iskreno nisam dublje zalazio u bezbednost ali cimam se vec duze vreme i kao sto vidim nemoguce je odraditi sem ako oni nemaju neke nove metode...

[ djoka_l @ 17.07.2013. 20:07 ] @
Ne treba da upišeš ' or 1=1' nego treba bez tog znaka navoda na kraju, dakle ' or 1=1
Drugo, ispiši kveri pre nego što pozoveš mysql_query, kako bismo mogli da ti pomognemo, tj. da vidimo tačno zbog čega javlja sintaksnu grešku u kveriju (da nije još neka osim viška apostrofa).
Treće, piše se odvojeno: "ne znam, ne pomisle, ne zanima, ne radi", takođe treba "da bih zaštitio" a ne da BI zaštitio.
[ Radovan__III @ 17.07.2013. 22:25 ] @
Pricati o zastiti a na direktan nacin ubacivati string u query je nedopustivo. Google: "Prepared Statements php"
[ ivan.a @ 18.07.2013. 06:22 ] @
Da, uz to mysql_real_escape_string i mysql_query su deprecated.

Koristi, PDO sa prepared statements.
[ agvozden @ 18.07.2013. 10:08 ] @
^ a gde si nasao da je mysql_real_escape_string deprecated?

osim ukoliko mislis da ce ceo segment mysql uskoro biti deprecated? onda ga menja mysqli::real_escape_string ...
[ pajaja @ 18.07.2013. 10:15 ] @
http://php.net/manual/en/function.mysql-real-escape-string.php
[ agvozden @ 19.07.2013. 08:37 ] @
^ ha-ha, kada ides preko Gugla dobijes ti link gde ne stoji to obavestenje:

http://php.net/manual/sr/function.mysql-real-escape-string.php
[ alfa-pro @ 19.07.2013. 11:56 ] @
Cek i koja je sada razlika izmedju MySQL i MySQLi? posto vidim da 80% posle ovog posta forsiraju MySQLi i PDO a MySQL ko da polako nestaje.
[ ivan.a @ 19.07.2013. 13:55 ] @
Citat:
agvozden:
^ ha-ha, kada ides preko Gugla dobijes ti link gde ne stoji to obavestenje:

http://php.net/manual/sr/function.mysql-real-escape-string.php

To nema veze sa google-om, već u zavisnosti od lokalizacije tvog browsera (google na osnovu toga prikazuje rezultate...i zato te preusmerava na /sr/ a ne /en/ na php.net). Inače, ova informacija stoji već duže vreme...

@alfa-pro,

glavna razlika u tome je što mysql funcije su proceduralne i koriste "ručne" prepared statements. mysqli je zamena za mysql samo sa OO i ima podršku za prepared statements. PDO (PHP Data Objects) je fleksibilni layer za bazu podataka koji podržava MYSQL, kao i mnoge druge baze podataka.