[ Kusur @ 25.03.2004. 18:22 ] @
Pozdrav svima

Sajt php, MySQl

Šta je "injection".

Administrator provajdera koji "hostuje moj" sajt me upozorio da na sajtu imam "injection" i da ja to potencijalna opasnost.

Neznam o čemu se radi – malo sam pretražio ovaj forum i vidim da se pominje SQL-injection, da li to isto?

Kako da pronađem grešku i kako da je ispravim to jest da se zaštitim?

Bio bih vam zahvalan ako bi mi neko malo pojasnio sve ovo.

Unapred puno hvala
[ NetworkAdmin @ 26.03.2004. 13:41 ] @
pa sad znas kad koristis forme i varijable koristis da bi napravio query taj query moze biti opasan za tvoju sql bazu jer moze neko postati nesto sto ti nisi predvidio i tako da ti napravi sql injection.

Daj reci gdje kazu da imas injection...?
[ Kusur @ 26.03.2004. 16:54 ] @
Šta ja mogu da uradim da sprečim to?

Na sajtu imam spisak vesti, pa sa tog spiska link ka toj vesti:

Na primer:
vest.php?vest_id=12 itd.

a vest_id je stvarno ime polja u tabeli vesti

Treba li da uradim na drugi način?
[ Zoran Rašković @ 26.03.2004. 19:15 ] @
Pa treba da uradiš sve što možeš da do injectiona ne bi došlo..

Znači sve promenljive koje se prosleđuju sa stranice na stranicu prvo proveriš do detalja, uveriš se da je neka promenljiva tačno to što treba da bude... Ako je sve u redu, pustiš promenljivu u sql query. Ima tu još mnogo caka....
[ ljtruba @ 26.03.2004. 23:53 ] @
To zapravo znaci da neko putem varijable te recimo id moze da unese nesto nepredvidjeno i da ti se uloguje i hakne ti sajt

Kako to radi
http://www.google.com/search?q=sql+injection

Recimo imas upit
select id, forename, surname from authors

i kad uneses neke vrednosti dobijes
select id, forename, surname from authors where forename = 'john' and surname = 'smith'

e a onda neki drpipac unese
Forename: jo'; drop table authors--
i sve obrise ti tabelu ili usere ili tako nesto

Najbolje je da pogledas google link
kako resiti ovaj problem, pa jednostavno na svaku promenljivu koju ukljucujes u sql upit uradi funkciju addslashes i siguran si
[ ljtruba @ 26.03.2004. 23:57 ] @
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
[ Kusur @ 27.03.2004. 00:21 ] @
.... uradi funkciju addslashes ...


Kako da uradim ovu funkciju - da li u MySql manual-u ima nešto otome?
[ afwt @ 27.03.2004. 03:25 ] @
Umesto:
$q = "SELECT * FROM users WHERE id='$id'";

pises:
$q = "SELECT * FROM users WHERE id='" . addslashes($id) . "'";

ili:
$sql_id = addslashes($id);
$q = "SELECT * FROM users WHERE id='$sql_id'";
[ Ilija Studen @ 27.03.2004. 07:34 ] @
Da li ovaj kod resava probleme?

Code:
if( !get_magic_quotes_gpc() ) {
  if( is_array($_GET) ) {
    while( list($k, $v) = each($_GET) ) {
      if( is_array($_GET[$k]) ) {
        while( list($k2, $v2) = each($_GET[$k]) ) {
          $_GET[$k][$k2] = addslashes($v2);
        }
        @reset($_GET[$k]);
      } else {
        $_GET[$k] = addslashes($v);
      }
    }
    @reset($_GET);
  }
  // ... Isto za $_POST i $_COOKIE
  // (c) phpBB group
}


Ako ne resava recite.

BTW: Svi query-ji idu preko klase koju sam napisao za rad sa MySQL-om tako da ih mogu uvek parsirati, proveravati i raditi sa njima sta god hocu pre nego sto se izvrse.
[ Kusur @ 27.03.2004. 13:27 ] @
Ne ide mi nikako ovo sa '" . addslashes($id) . "'"

Da li neko moze da mi pomogne evo primera:

Tri tabele grupe, pod_grupe, vesti

Prava strana - spisak grupa za koje ima vesti

grupe.php:
Code:

SELECT *
FROM vesti, grupe
WHERE vesti_grupa=grupa_id
GROUP BY vesti_grupa



link ka strani pod_grupe.php:
<a href="pod_grupe.php?grupa_id=<?php echo $row_rsvesti['grupa_id']; ?>"></a>

Druga strana - spisak pod_grupa u okiru trazene grupe za koje ima vesti

pod_grupe.php:

Code:
SELECT *
FROM pod_grupe, vesti
WHERE grupa_id=colname and pod_grupa_id=vest_pod_grupa_id
GROUP BY vest_pod_grupa_id


Code:
colname=$HTTP_GET_VARS['grupa_id']


Treca strana spisak vesti u pod_grupi... itd.
[ -zombie- @ 27.03.2004. 15:06 ] @
ilija: to deluje ok, osim ako negde drugde nisi otvoren za injection.. tako nešto i ja imam, samo na drugom mestu, tj pri prosleđivanju parametara sql upita..

Citat:
ljtruba:
e a onda neki drpipac unese
Forename: jo'; drop table authors--
i sve obrise ti tabelu ili usere ili tako nesto


to naravno ne može (kao što sam već par puta objašnjavao), zato što mysql ne dozvoljava unos više upita pri jednom pozivu funkcije mysql_query().

naravno da na ovo treba paziti, ali ne treba to raditi sa netačnim i preuveličanim primerima..
[ Goran Rakić @ 29.03.2004. 13:49 ] @
Ilija to je ok, samo meni je logičnije da se isto (ja ipak koristim funkcije sql_int, sql_string, sql_bool) nalazi pri sastavljanju upita nego da radiš proveru GET parametara. Na primer negde ti nešto iz GET-a može trebati bez kosih crta ;), ovako samo usporavaš sve. Plus, šta ako nešto čitaš iz baze što je umetnuto na drugom mestu, pa ako čitaš datoteku, i na kraju šta ako prenosiš serijalizovan niz kroz GET? ;)

Više upita se ne može od jednom izvršiti, ali ima lepih fora sa "OR 1=1" pri proveri user/pass kombinacije ;)
[ ljtruba @ 30.03.2004. 10:17 ] @
Citat:
-zombie-:
ilija: to deluje ok, osim ako negde drugde nisi otvoren za injection.. tako nešto i ja imam, samo na drugom mestu, tj pri prosleđivanju parametara sql upita..

Citat:
ljtruba:
e a onda neki drpipac unese
Forename: jo'; drop table authors--
i sve obrise ti tabelu ili usere ili tako nesto


to naravno ne može (kao što sam već par puta objašnjavao), zato što mysql ne dozvoljava unos više upita pri jednom pozivu funkcije mysql_query().

naravno da na ovo treba paziti, ali ne treba to raditi sa netačnim i preuveličanim primerima..


OK, ali ja primer nisam dao samo za mysql vec za sql uopste.
nisam ja izmislio taj primer vec sam ga kopirao sa nekog sajta, kontam da je to najbolji nacin da se coveku objasni sta je to "injekcija" :)
A za mysql_query() se slazemo naravno
[ NetworkAdmin @ 30.03.2004. 10:44 ] @
Citat:
Goran Rakić:
Više upita se ne može od jednom izvršiti, ali ima lepih fora sa "OR 1=1" pri proveri user/pass kombinacije ;)


Da potpuno si u pravu, samo ko li pise takav kod da mu SQL pravi verifikaciju... obicno bi trebalo povaditi podatke iz baze pa porediti sa get post varijablama...
[ Kusur @ 30.03.2004. 19:31 ] @
Ja sve radim u Dreamweaver-u, tako da kada se "pozovem" na neku varijabilu iz forme Dreamweaver mi ispred "Select" ubaci sledeći kod:

Code:
}
$colname1_aktivan = "1";
if (isset($HTTP_POST_VARS['jmbg'])) {
  $colname1_aktivan = (get_magic_quotes_gpc()) ? $HTTP_POST_VARS['jmbg'] : addslashes($HTTP_POST_VARS['jmbg']);
}
[ Ilija Studen @ 07.04.2004. 15:29 ] @
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf