Šta koristiti mysql_real_escape_string() ili addslashes()

Pozdrav,

dali mi možete reći šta je bolje za zaštitu od sql injection?

addslashes() ili mysql_real_escape_string()

i kad postavljam addslashes() jel treba vako

ili može bez get_magic_quotes_gpc()

a drugo pitanje je jel treba i u mysql_real_escape_string() postaviti u get_magic_quotes_gpc()

vako

ili bez get_magic_quotes_gpc()

[quote=“susok”]

Dobro si primijetio problematiku, koristi ovo što sam ostavio. S tim da ti je primjer krivi, pogledaj si zagrade. $_POST[] ti mora biti u funkciji kao parametar, a ne pored nje. Ako koristiš samo ovu funkciju, onda ti addslash ne treba.

Ali pogledaj za svaki slučaj kako ti baca u bazu da se kasnije ne iznenadiš.

Najsigurniji su tzv. prepared statements, ali one su nesto sporiji od klasicnih query-ja. Koristi mysql_real_escape_string i to tako da sa stripslashes maknes eskejpanje koje je nastalo ukoliko je ukljucen magic_quotes:

evo ja sam vako postavio

jel ovo vako uredu i oćul sad gdje god budem nešto upisivi u bazu ili provjeravo u bazi postavljat, kao ovo gor?

Hvala na pomoći!

To ima smisla raditi samo za odredjene tipove podataka (VARCHAR2 npr.), dok za druge (brojeve npr.) nema.

Pa šta onda oćul stavljat ovo il da stavljam samo

Pa valjda sam mozes zakljuciti da je korisnicko ime (i password) string i da se sprema kao VARCHAR2 u bazi, te da ga je zato potrebno eskejpati. Malo razmisljaj sta radis. :slight_smile:

ok uredu. A dali će šta smetati ako sve budem vako ekejpo i ovo sto se sprema kao int, enum, itd. ili ove ostale trebam samo

$korisnickoime_za_provjeru=mysql_real_escape_string($korisnickoime_za_provjeru);

password bi trebalo spremat u obliku hasha, npr md5, pa ga onda nebi trebalo escapeat jer čim napravi md5 nema straha od injectiona…

ok, a datum $datum=date(‘Y-m-d H:i:s’); jel to moram eskejpati ili je to sigurno od injection/a

a imam i ovo u skripti

$ip_korisnika=$_SERVER[‘REMOTE_ADDR’];
$host_korisnika=gethostbyaddr($ip_korisnika);

i sad jel moram i ovo?

Ne. IP ostaje kako je bio, IP adresa ti je xxx.xxx.xxx.xxx i korisnik ju ne množe mijenjati.

TI moraš filtrirati sve podatke koji ti user može modificirati. A to su:

  • Textarea
  • Input text
  • Eventualno drop-down list, ovisi kako si radio. Pogledaj si malo na manualu od phpa, sve ima.

[quote=“Gosaric”]Ne. IP ostaje kako je bio, IP adresa ti je xxx.xxx.xxx.xxx i korisnik ju ne množe mijenjati.

TI moraš filtrirati sve podatke koji ti user može modificirati. A to su:

  • Textarea
  • Input text
  • Eventualno drop-down list, ovisi kako si radio. Pogledaj si malo na manualu od phpa, sve ima.[/quote]

ma gledam evo stalno na php manualu,

a jel trebam eskejpati ove podatke koje spremam u bazu kao enum npr. gdje korisnik odabire spol, jer tu nemože korisnik ništa upisivati samo može odabrati,

[quote=“susok”]ok uredu. A dali će šta smetati ako sve budem vako ekejpo i ovo sto se sprema kao int, enum, itd. ili ove ostale trebam samo

$korisnickoime_za_provjeru=mysql_real_escape_string($korisnickoime_za_provjeru);[/quote]

Nece smetati eskejpanje brojeva jer ce se oni ionako automatski konvertirati iz stringa u broj (npr. "INSERT INTO tablica(broj) VALUES (‘1’)), bar u vecini baza podataka.

Medjutim, to ne bi trebao raditi, nego bi trebao validirati da li je to broj (ctype_digit mislim da se zove funkcija ili tako nesto) ili jednostavno napraviti pretvorbu u integer na PHP strani: $var = (int) $_POST[‘var’]; (ali pazi jer se string pretvara u nulu ukoliko nije broj, npr. ‘abc’ => 0).

I da, eskejpaj to korisnicko ime. :smiley:

Da. To moze i bez eskejpanja (iako nece doci do greske ako se i eskejpa pa hashira), jer hash sigurno nema niti jedan specijalan znak.

[quote=“susok”]ok, a datum $datum=date(‘Y-m-d H:i:s’); jel to moram eskejpati ili je to sigurno od injection/a

a imam i ovo u skripti

$ip_korisnika=$_SERVER[‘REMOTE_ADDR’];
$host_korisnika=gethostbyaddr($ip_korisnika);

i sad jel moram i ovo?[/quote]

Trebas eskejpati sve sta dolazi od korisnika i ono za sta mislis da bi moglo sadrzati neki od specijalnih znakova. Ukoliko si u dvojbi, radije eskejpaj. :smiley:

“date” ne moras eskejpat jer ne dolazi od korisnika, a siguran si kako ce datum izgledati (npr. 2010-04-14 17:07:00). Dakle, u tom prikazu nema niti jedan specijalan znak niti ga ikojem slucaju moze biti, tako da ti je taj podatak siguran za unos u bazu.

$_SERVER superglobalno polje je vecinom sigurno (ima mozda par stavaka koje su eventualno nesigurne, ali trenutno nisu ni bitne, niti ih se mogu sjetiti :smiley: ), tako da se ne moras brinuti o eskejpanju tih varijabli - osim naravno ukoliko ne sadrze neki specijalan znak (a IP adresa sigurno ne sadrzi).

Sve sta dolazi od POST, GET, COOKIE i mozda jos ponesto.

On ti moze poslati sta oce. Ako mu ti serviras HTML select sa dvije opcije: 0 i 1, to ne znaci da ti on ne moze poslati 3.

Znam da sam dosadan al možeš li mi reći oćul i ovo spol sto spremam u bazu kao enum eskejpati vako

ili treba samo

i dal treba stavljati u funkciju if(get_magic_quotes_gpc()) uzvičnik vako (obilježio sam ga sa crvenom bojom)

if([color=“Red”]![/color]get_magic_quotes_gpc())

Hvala!

Ja osobno ne bi eskejpao enum. Napravio bi nesto ovako:

Gornji kod provjerava da li postan spol i da li je u enum vrijednostima, ako jest postavi ga na tu vrijednost, inace stavi defaultno ‘m’ (sovinist sam, jbg :D). Mozes i nesto drugo staviti, npr. FALSE, pa provjeriti da li je $spol razlicit od FALSE, ukoliko ti je to obavezan podatak. Tako ne moras nista eskejpat jer znas da ce ti vrijednost u $spol biti ili m ili z.

Na ostalo ti necu odgovoriti jer ti je vec objasnjeno (osim usklicnika, a to je nista drugo nego negacija), samo trebas razumjeti napisano (odnosno, ukljuciti malo mozak). :slight_smile:

A nebi mu dao link na ternary operatora :smiley:

http://php.net/manual/en/language.operators.comparison.php
(potraži “ternary operator”)


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja