"SELECT $_GET['what'] FROM users WHERE nick = `$_GET['nick']`;"
....
skript.php?what=name&id=nick`; DROP users;
-----
krome toho, ze misto ` by u _GET['nick'] mel autor pouzit ' (tedy apostrofy), si s jeho tvrzenim troufam dvojnasobne nesouhlasit.
1. v php.ini je defaultne zaple magic_quotes_qpc = 1. To znamena, ze veskere "nebezpecne" znaky v promennych od uzivatele (respektive z _GET, _POST a _COOKIE poli) jsou escapovany backslashem, takze misto autorem ocekavaneho
SELECT * FROM users WHERE nick = 'nick'; DROP users;
vznikne neskodne
SELECT * FROM users WHERE nick = 'nick\'; DROP users;'
navic, pokud je magic_quotes_gpc zaple a provedete autorem doporucovane mysql_real_escape_string, budete mit v databazi spoustu nadbytecnych stredniku.
dalsi vyhrada:
2. funkce mysql_query() odmitne provest vice nez jeden SQL dotaz, takze se bud provede jenom ten prvni (SELECT * FROM users WHERE nick='nick'), nebo bude vracena chyba a zadne data nezmizi.
Kazdopadne na dalsi pokracovani se tesim, hlavne na zrychleny vyvoj aplikaci :-)
A ja zase trvám na tom, že Vaša možnosť správna nie je. :-) Aj keď funguje. Ide o to, že keď index neuzavriete do apostrofov, tak PHP najprv hľadá konštantu s názvom nick, definovanú pomocou define(), a keď žiadnu nenájde, tak to vezme ako reťazec "nick". Myslím, že ak si zapnete zobrazovanie úplne všetkých chýb (E_ALL), tak to (myslím) zobrazí notice.
A schválne. Skúste si pred použitím spraviť:
define('nick', 'HelloWorld');
a potom vyskúšať, ako sa to prejaví vo Vašom reťazci. PHP ho vyhodnotí ako $_GET['HelloWorld'] a budete tam, kde ste nechceli byť. :)
Ne, opravdu není správná.
Pokud bych měl asi takovéhle pole:
$pole[‚1‘] = „Prvni hodnota“;
$pole[‚0‘] = „druha hodnota“;
// Tak by vysledky vypadaly asi nasledovne:
echo $pole[0]; // Prvni hodnota
echo $pole[‚0‘]; //Druha hodnota
echo $pole[1]; // Druha hodnota
echo $pole[‚1‘]; // Prvni hodnota
Takže očividně není jedno, jestli je to v úvozovkách nebo ne ;)
A preco by to podla teba neslo neslo? As far as I know, ak php parser narazi na taketo nieco:
$foo = BAR;
najskor skontroluje ci BAR nie je definovana konstanta. Kedze asi nie je (co prepokladame), PHP automaticky urobi konverziu a bude postupovat dalej, ako keby BAR bola definovana ako retazcova konstatna 'BAR' (viac info: http://sk2.php.net/manual/en/language.types.array.php#language.types.array.foo-bar -- "It works because PHP automatically converts a bare string (an unquoted string which does not correspond to any known symbol) into a string which contains the bare string. For instance, if there is no defined constant named bar, then PHP will substitute in the string 'bar' and use that."). Samozrejme, hovoriac o cistote programovania, toto urcite nie je bezpecny sposob, ale funguje!
Apropos, najinteligentnejsi sposob ako zapisat spominany query je pouzit operator . (bodka - spajanie retazcov):
mysql_query("SELECT xyz FROM zyx WHERE something LIKE '" . $_GET['somewhat']);
Este cosi. Neviem preco to nebolo v clanku spomenute, ale urcite nie je na skodu pouzivat funkcie AddSlashes (http://sk2.php.net/manual/en/function.addslashes.php) a StripSlashes (http://sk2.php.net/manual/en/function.stripslashes.php), takze este lepsie ako to co som napisal vyssie je:
mysql_query("SELECT xyz FROM zyx WHERE something LIKE '" . AddSlashes($_GET['somewhat']));
prave tohle je jedna z chyb, na kterou jsem upozornoval.. vetsina serveru ma magic_quotes_gpc, takze se addslashes provadi "samo od sebe" -> dalsim pouzitim vygenerujete hromadu nepotrebnych stredniku.. je pravda ze se na to neda spolehat, ale neni snad problem zkusit ini_get() nebo get_magic_quotes_gpc() (nejak tak se ta fce jmenuje..) a overit si to..
Nemozem suhlasit. Tym, ze sa bude pouzivat AddSlashes a StripSlashes sa nic nepokazi (samozrejme ak budu spravne pouzite = vsetky stringy co do DB vkladam AddSlashujem, vsetky co vyberam hned StripSlashujem). Magic quotes na tom nic nezmeni. Jedine co ti moze vadit je, ze to mozes mat zashlashovane dvakrat a aj o tom si nie celkom isty, ze to tak funguje. Ale aj keby, je to mizive percento dat, takze velkost sa ti nijak extremne nezmeni.
Znova opakujem, co moze programator osetrit sam, nech osetri a nespolieha sa na to, ze je to alebo hento zapnute, lebo admin zrazu upgraduje na verziu, kde to default zapnute nebude, alebo sa produkt preportuje na inu masinu, alebo dokonca platformu a potom vznikaju zbytocne problemy. Staci sa len naucit robit take veci a nezanedbavat ich, vsetko je to o zvyku. Stareho psa novym trikom len tazko naucis ;)
myslim ze jeho pohled na vec = TIMHLE ZPUSOBEM SE NEDA NIC POSRAT, AT JE SERVER NAKONFIGUROVANEJ JAKKOLI.
samo ze idealni by bylo do datovy vrstvy zakmochat automatickou detekci nastaveni nastaveni a automaticke (od)slashovani podle potreby, ale to nic nemeni na tom, ze predchozi zpusob je (alespon ze strany bezpecnosti) korektni. neefektivni, ale korektni.
V doporučené konfiguraci novjejsich php je magic_quotes_qpc vyple. Pro praktické použití se ani nevyplatí zapinat, protoze v 99% parametr jeste pred tim nez jej pouziju nejakym zpusobem zpracovavam (ruzne kontroly, converze) a pri tom zpetne lomitka jen zavazí. Já používám knihovnu pro praci s SQL ktera automaticky escapuje napriklad vkladana data.