Autor Zpráva
drak654
Profil
URL:
http://localhost/?kat=1

PHP:
...
$kat = $_GET["kat"];
$query = "SELECT id FROM hlasovania WHERE kat=".$kat." ORDER BY cas DESC";
$result = mysql_query($query);
while($row=mysql_fetch_array($result) {
...
}
...


Keď je všetko tak, ako má byť, všetko funguje. Avšak problém nastane vtedy, keby si niekto zmenil adresu na
http://localhost/?kat=1%20or%20kat=2
. To by znamenalo, že by platilo
$query = "SELECT id FROM hlasovania WHERE kat=1 or kat=2 ORDER BY cas DESC";
a to by vypísalo riadky v tabuľke aj s kat 1 aj s kat 2, čo samozrejme nechcem. Ako sa proti tomu ochrániť?
DarkMeni
Profil
vono je těch horších scénářů víc (například kdyby napsal: "kat=;--;DROP TABLE hlasovania;DROP DATABASE databaze... atd" ale někdy stačí funkce mysql_real_escape_string který změní ukončení příkazu na obyčejný středník, a nebo použitím větvení:
$kat = mysql_real_escape_string($_GET["kat"]);
if(is_numeric($kat)){
 //mysql_query...
}
pcmanik
Profil
DarkMeni:
A pri obycajnych cislach dobre posluzi
intval()
DarkMeni
Profil
s intval jsem se ještě nesetkal a angličtinu moc neovládám ale "The scalar value being converted to an integer" asi znamená něco jako převod na integer (celé číslo), sice to zabrání udělání nějakého nepořádku v databázi ale potom nepůjde logovat podezření na hacknutí:
$kat = mysql_real_escape_string($_GET["kat"]);
if(is_numeric($kat)){
 //mysql_query...
}else{
  $ip = $_SERVER["REMOTE_ADDR"];
  mysql_query("INSERT INTO logs (type, value, ip) VALUES ('PossibleXSS', ".$kat.", ".$ip.")");
}

I když je to skoro k ničemu tak jestli návštěvník nebude muset měnit už připravenou url a stejně jí změní tak asi moc čistý úmysly mít nebude a v případě pokusu o smazání tabulek nebo tak něčeho, tak tomu někomu zablokuju přístup z té IP, teda jestli bude vidět že to myslel fakt vážně.
drak654
Profil
mysql_real_escape_string() musím použiť 5 krát, čo mi spomaľuje načítanie stránky o nejakých 5 sekúnd. Dá sa s týmto niečo robiť?

// A vlastne nie. Je všetko v poriadku. Tak ďakujem za rady.
pcmanik
Profil
DarkMeni:
Ono to vsetko vyhodi a necha len cisla, ale ak to skutocne chces logovat tak potom dobre, inak este odporucam prepare_statements, ale treba na to rozlisenie mysqli, no ma to vela vyhod :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0