Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Potřebuju poradit s PHP kódem

Zdravím. Potřeboval bych si upravit soubory z phpRS tak, aby se po kliknutí na odkaz změnil vzhled webu, jako je to popsané tady: odkaz.

V komentáři pod článkem jsem však narazil na tohle:

Obsah COOKIE je nutné ošetriť pred SQL injection, inak si koliduješ o problémy.
...and $_COOKIE[vzhled]=g.ids",$dbspojeni)

Nevím ale, kam to mám do toho kódu napsat. Je to vůbec třeba? Co se může stát, když to takto "neošetřím"?

Předmět Autor Datum
Keďže očakávaš, že ti klient pošle v cookie číslo, tak je dobré to ošetriť tak, aby tam číslo naozaj…
los 25.01.2009 14:54
los
Díky za reakci. Takže tím, co jsi napsal, mám nahradit podmínku v config.php na řádku 101? Takže i…
Dave 25.01.2009 17:05
Dave
Jenom šoupnu starší téma o něco výš. Ptám se, jestli je to tak, jak jsem psal v příspěvku výše, sprá… poslední
Dave 30.01.2009 18:31
Dave

Keďže očakávaš, že ti klient pošle v cookie číslo, tak je dobré to ošetriť tak, aby tam číslo naozaj bolo. Najjednoduchšie je upraviť podmienku pred zavolaním SQL príkazu:

if(empty($_COOKIE["vzhled"])) {
  $_COOKIE["vzhled"]="c.hodnota";
} else {
  $_COOKIE["vzhled"]=(int)$_COOKIE["vzhled"];
}

Alebo sa to dá zapísať aj kratšie:

$_COOKIE["vzhled"] = empty($_COOKIE["vzhled"]) ? "c.hodnota" : (int)$_COOKIE["vzhled"];

Lepšie by bolo ukladať si výsledok inde než do $_COOKIE["vzhled"], aby si vedel, v ktorej premennej máš hodnotu od používateľa a kde už máš ošetrenú hodnotu.

Bez ošetrenia SQL injection sa môže stať všeličo (prepísanie dát v tabuľkách, vymazanie tabuliek a pod.). V tomto konkrétnom prípade mi nenapadol nijaký tragický útok, ktorého dôsledkom by bola strata dát. To platí za predpokladu, ak nie je povolené používať viacero SQL príkazov oddelených bodkočiarkou - záleží od typu databázy, napr. mysql_query to nepodporuje. V každom prípade by sa však asi dal vyradiť SQL server nejakým DoS útokom.

Lepšie, než rozmýšľať, čo všetko by sa mohlo pokaziť, je napísať to poriadne - je to menej namáhavé.

Díky za reakci. Takže tím, co jsi napsal, mám nahradit podmínku v config.php na řádku 101?

Takže

if(empty($_COOKIE[vzhled])) {
$_COOKIE[vzhled]="c.hodnota";
}
$dotazhod=phprs_sql_query("select g.ident_sab,g.soubor_sab,g.adr_sab from ".$rspredpona."config as c,".$rspredpona."global_sab as g where c.promenna='global_sab' and $_COOKIE[vzhled]=g.ids",$dbspojeni);

nahradit za

if(empty($_COOKIE["vzhled"])) {
$_COOKIE["vzhled"]="c.hodnota";
} else {
$_COOKIE["vzhled"]=(int)$_COOKIE["vzhled"];
}
$dotazhod=phprs_sql_query("select g.ident_sab,g.soubor_sab,g.adr_sab from ".$rspredpona."config as c,".$rspredpona."global_sab as g where c.promenna='global_sab' and $_COOKIE[vzhled]=g.ids",$dbspojeni);

?

Změní se tedy pouze to, že přibude řádek s "else". Už to trochu chápu.

Zpět do poradny Odpovědět na původní otázku Nahoru