"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 :-)
Vlákno názorů k článku
PHP pro experty: bezpečnost
Závažné chyby ve článku
Re: Závažné chyby ve článku
Ad uvozovky:
Navic ony jednoduche uvozovky v hranatych zavorkach nesmi byt (tak, jak je to napsano, to zpusobi parse error).
"SELECT $_GET[what] FROM users WHERE nick='$_GET[nick]'"
Re: Závažné chyby ve článku
bez uvozovek ani apostrofu u pole to urcite nepujde, bylo by potreba dat to do zavorek.. takze {_GET['nick']}
Re: Závažné chyby ve článku
lol.. tady se to php odborniky jen hemzi...
prectete si obcas i ty zdanlive nezazivne pasaze v manualu, treba u poli, parsovani promennych v retezci atd. i jako dlouholety php programator se urcite neco dozvite
ad porovnani ruznych typu - co zkusit operator === ?
Re: Závažné chyby ve článku
Noo... takmer správne, ale chýba ti tam teraz $. :-) Ale určite to bol iba preklep.
Takže úplne správne v reťazci by to malo byť: "{$_GET['nick']}"
Re: Závažné chyby ve článku
To je taky moožnost. Ale má verze je to elegantnější a naprosto správná, na tom trvám. Můžete vyzkoušet a/nebo se podívat do PHP manuálu.
Re: Závažné chyby ve článku
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ť. :)
Re: Závažné chyby ve článku
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 ;)
Re: Závažné chyby ve článku
Bez uvozovek to nepůjde? Na základě čeho tak soudíte...
http://cz.php.net/manual/cs/language.types.string.php#language.types.string.syntax.double
A preco by to neslo? [WAS:Závažné chyby ve článku]
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']);
Re: A preco by to neslo? [WAS:Závažné chyby ve článku]
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']));
Re: Este raz a naposledy
Ospravedlnujem sa, je to tu trosku neprehladne, samozrejme, treba este doplnit koncovy apostrof a malo by to byt dobre:
mysql_query("SELECT xyz FROM zyx WHERE something LIKE '" . AddSlashes($_GET['somewhat']) . "'");
Re: Este raz a naposledy
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..
Re: Este raz a naposledy
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 ;)
Re: Este raz a naposledy
Nesuhlasim. Ak pridas addslashes(), tak to budes mat tie backslashe dva krat.
Re: Este raz a naposledy
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.
Re: A preco by to neslo? [WAS:Závažné chyby ve člá
dobre, ale tak muzete prehlednutim pouzit nazev nejake definovane konstanty.. pokud se ma clanek tykat bezpecnosti prograwmovani, tak je pouziti uvozovek urcite vhodne..
Re: A preco by to neslo? [WAS:Závažné chyby ve člá
To je samozrejme. Pouzivanie stringov bez uvodzoviek/apostrfov je vec sakra nebezbecna, ale funguje a preto nie je na skodu vediet ako.
Re: Závažné chyby ve článku
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.
Re: Závažné chyby ve článku
Nevím, co je to doporučená konfigurace, ale v implicitní konfugurace PHP 4 i 5 je magic_quotes_gpc 1. Tak tomu je i na většině hostinzích.
Ano, strašně mně to vadí, protože si užívám zbytečnou gymnastiku se stripslashes a addslashes, ale nic jiného s tím nenadělám.
Re: Závažné chyby ve článku
Doporučená konfigurace se nachází v php.ini-recommended, výchozí je v php.ini-dist.
Re: Závažné chyby ve článku
Jestli ti tvuj hosting nechce nastavit php podle tvych "rozumnych pozadavku" tak takovy hosting posli do ( )( ) a jdi jinam.

