Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
PHP okénko: Escapování

Michal Molhanec aura:100
18. 4. 2005 0:33 Nový

kdy escapovat

celé vlákno
No ja radsi escapuju pri ukladani, clovek tam pak muze v pripade potreby vlozit rucne kus html.

BTW chape nekdo popis urlencode v PHP manualu, myslim ten konec o htmlentities? IMHO z urlencode vzdycky vyleze jenom
a-zA-Z0-9-_.+
ne?
spaze
spaze (neregistrovaný)
18. 4. 2005 2:22 Nový

Re: kdy escapovat

celé vlákno
Z urlencode vyleze jeste bonusovy % :) Nicmene v tom manualu chteji rici to, ze se muze stat, ze query string bude *v HTML* vypadat nasledovne: ?foo=bar&amp=win, pricemz &amp muze browser pochopit jako entitu a vysledek pak bude ?foo=bar&=win. Pri pouziti htmlspecialchars() se & zmeni v & a browser to pak pochopi spravne. Opakovani je matka moudrosti a mnoho lidem to nedojde a pak tezko hledaji chybu, proto je to IMHO tam uvedeno. BTW, diky, opet sem nasel zminku o "W3C-suggested semi-colon" :)
Michal Molhanec aura:100
18. 4. 2005 12:18 Nový

Re: kdy escapovat

celé vlákno
Ale v tom manualu je primo ukazka:
htmlentities(urlencode($userinput))
a ja se ptam: kdy muze z urlencode() vylizt neco, co htmlentities() zkonvertuje? IMHO nikdy, ne?
spaze
spaze (neregistrovaný)
18. 4. 2005 20:11 Nový

Re: kdy escapovatRe: kdy escapovat

celé vlákno
Mas pravdu, nikdy. Ale i presto je asi dobry html*() znat :)
Michal Molhanec aura:100
18. 4. 2005 22:00 Nový

Re: kdy escapovatRe: kdy escapovat

celé vlákno
Ale zase, ze by meli v tom manualu takovej nesmysl?
Jakub Vrána aura:61
19. 4. 2005 12:04 Nový

Re: kdy escapovatRe: kdy escapovat

celé vlákno
V manuálu byl skutečně nesmysl, opravil jsem to v CVS.
spaze
spaze (neregistrovaný)
19. 4. 2005 12:53 Nový

Re: kdy escapovat

celé vlákno
Good job, chtel jsem napsat, ze by bylo vhodny "file a bug report" (a myslel pritom prave na tebe :P, ale uz je to zbytecny, so, diky..
Michal Kubeček
Michal Kubeček (neregistrovaný)
18. 4. 2005 0:50 Nový

proč ne htmlencode předem

celé vlákno
Autor zapomněl na jeden, IMHO nejpodstatnější, důvod, proč htmlencodovat data až před tím, než se budou zobrazovat na web. Protože mnohdy s těmi daty potřebujeme provádět i něco jiného, než je rovnou zobrazit na web, (a nebo s nimi pracujeme i z jiných klientů než z PHP) a pak bychom si zbytečně přidělávali práci s jejich zpětným dekódováním. Ze stejných důvodů by bylo záhodno, aby berličky typu magic_quotes_gpc co nejdříve zmizely v propadlišti dějin spolu s dalšími hříchy nezralého mládí, jako register_globals…
Marián Černý
Marián Černý (neregistrovaný)
18. 4. 2005 3:14 Nový

Re: proč ne htmlencode předem

celé vlákno
Co je az take nezrale na magic_quotes_gpc? Chapem, ze register_globals je riadna sprostost, ale "magic_quotes_gpc on" v default konfiguracii je IMHO velmi dobra vec. Je mnozstvo ludi, ktory pisu PHP a vobec uvazovat o bezpecnosti svojho diela ich ani nenapadne. Potom staci niekde najst odkaz typu:

<a href="?zmaz_id=13">Zrusit ucet</a>

a ked je tento implementovany priblizne takto:

mysql_query ("DELETE FROM ucty WHERE id = '{$_GET['zmaz_id']}'");

tak staci ako zmaz_id zadat \"13\' OR 1 OR \'a\' = \'\" a razom zmazeme celu tabulku. Samozrejme takto je to nespravne, spravne by to malo vyzerat takto:

$id_escaped = addslashes ($_GET['zmaz_id']);
mysql_query ("DELETE FROM ucty WHERE id = '$id_escaped'");

alebo dokonca pre pripad, ze by programator este nieco prehliadol (pri zlozitejsich dotazoch):

$id_escaped = addslashes ($_GET['zmaz_id']);
mysql_query ("DELETE FROM ucty WHERE id = '$id_escaped' LIMIT 1");

Lenze toto by asi nerobil skoro ziaden zaciatonik a mierne pokrocily programator v PHP.

Samozrejme, tomu komu to vadi, ten si moze nastavit HTTP server tak, aby bolo magic_quotes_gpc default off. Pripadne sa to da prenastavit aj pre jednotlive stranky (teda aspon si to myslim, neskusal som to).
Marián Černý
Marián Černý (neregistrovaný)
18. 4. 2005 3:25 Nový

CHYBKA ROOTu pri vkladani textu

celé vlákno
Ospravedlnujem sa za to

\"13\' OR 1 OR \'a\' = \'\"

spravne to malo byt

"13' OR 1 OR 'a' = '"

To sposobil ROOT, ked som si zvolil formatovanie textu ako xHTML a stlacil som "Zobrazit nahled". Mal som tam chybu a vsetky apostrofy a uvodzovky mi to escapovalo. Rucne som vecsinu odmazal az na tieto. Toto asi trosku nahrava povodnemu autorovi prispevku ;-), ze magic_quotes_gpc by malo byt off, pretoze na druhu stranu su programatori, ktori zase zabudaju na vhodnych miestach pridat volanie stripslashes() (obak addslashes()). :-(
fbumake
fbumake (neregistrovaný)
18. 4. 2005 4:33 Nový

Re: CHYBKA ROOTu pri vkladani textu

celé vlákno
nebo staci:
1 or true ... a pokud to ma v uvozovkach tak treba:
' or ''='

;]
Michal Kubeček
Michal Kubeček (neregistrovaný)
18. 4. 2005 12:28 Nový

Re: CHYBKA ROOTu pri vkladani textu

celé vlákno
Vida, jeden z důvodů, proč je automatická konverze špatná, jste už našel sám… :-)
uživatel si přál zůstat v anonymitě
18. 4. 2005 8:00 Nový

Re: proč ne htmlencode předem

celé vlákno
Nechci ti do toho mluvit, ale v tvem pripade si staci napsat bash skriptik, ktery to wgetem pusti v cyklu a smazes celou db at uz mas nastaveni jakekoliv.

Ale zpet - argument spravnosti nastaveni jen proto, ze mnoho "programatoru" v PHP delaji kraviny a neosetruji vstupy, mi prijde dost licha. Uz treba proto, ze si je ZVYKNOU neosetrovat.

Takto by jim jednou nekdo smazal celou tabulku a oni by se mozna naucili i neco noveho. Takto si akorat jednou nabiji usta, az daji aplikaci na server, ktera ma magic_quotes_gpc vypnute. Jakoze (z vlastni zkusenosti) to je vetsina.
Marián Černý
Marián Černý (neregistrovaný)
18. 4. 2005 14:07 Nový

Re: proč ne htmlencode předem

celé vlákno
Jasne, staci napisat bash skriptik, ale to je taka vrstevnata ochrana... proste utocnik musi pouzit zase nieco naviac. A pokial nevidi ten PHP kod, tak musi tento trik s LIMIT 1 poznat... A naviac, ak ide o vecsiu tabulku (napr. 1000 zaznamov), utocnik si nemusi vsimnut efekt jedneho zmazania. Alebo ak ide o tu tabulku uzivatelov, tak ten efekt nepojde poznat skoro vobec, proste sa nejaky nahodny uzivatel neprihlasi.
Michal Kubeček
Michal Kubeček (neregistrovaný)
18. 4. 2005 12:24 Nový

Re: proč ne htmlencode předem

celé vlákno

Hřích nezralého mládí je to proto, že je to podobná berlička, která odnaučuje lidi myslet, jako bylo register_globals. Uvědomte si, že s daty, která dostanete přes get/post/cookies, potřebujete často provádět i jiné věci, než je okamžitě a bez jakéhokoli zpracování vrazit do databáze. Pokud máte zapnuté magic_quotes_gpc, budete v takových případech muset provádět zase konverzi zpět, což je hodně nešťastné. Navíc, jak už jsem zmínil, u některých databází se obejdete bez addslashes(), protože nemusíte psát data do dotazu, a opět byste prováděl zbytečnou konverzi tam a zpátky.

P.S. Jinak magic_quotes_gpc pochopitelně nelze zapnout/vypnout až ve skriptu (to už by bylo trochu pozdě).

AraxoN
AraxoN (neregistrovaný)
18. 4. 2005 14:19 Nový

Re: vypínanie magic_quotes_gpc za behu

celé vlákno
Nie je to síce úplne to isté, čo vypnutie magic_quotes_gpc, ale ja to úspešne používam:

/**
* Odstrani lomitka z hodnot pola, v pripade potreby aj rekurzivne
*
* @param array $arr Vstupne pole
* @return array Vystupne pole
*/
function unslashArray($arr) {
foreach ($arr as $key=>$val) {
$arr[$key]=(is_array($val) ? unslashArray($val) : stripslashes($val));
}
return $arr;
}

if (get_magic_quotes_gpc()) {
$_REQUEST=unslashArray($_REQUEST);
$_GET=unslashArray($_GET);
$_POST=unslashArray($_POST);
$_COOKIE=unslashArray($_COOKIE);
}
Michal Kubeček
Michal Kubeček (neregistrovaný)
18. 4. 2005 14:32 Nový

Re: vypínanie magic_quotes_gpc za behu

celé vlákno
Ve výsledku to sice bude fungovat, ale pořád zůstává neefektivní a zbytečná trasformace tam a zase zpátky.
AraxoN
AraxoN (neregistrovaný)
18. 4. 2005 17:47 Nový

Re: vypínanie magic_quotes_gpc za behu

celé vlákno
jj, ale ak server nemám vo vlastníctve a neviem donútiť vlastníka aby magic_quotes_gpc vypol, tak je to lepšie než zostávajúce 2 možnosti:
1) preprogramovať celú svoju aplikáciu, vrátane knižníc, ktoré si pestujem už roky
2) nechať to tak, a odporučiť klientovi, nech do formulárov nepíše apostrofy, úvodzovky a spätné lomítka
jkt
jkt (neregistrovaný)
19. 4. 2005 17:25 Nový

Re: vypínanie magic_quotes_gpc za behu

celé vlákno
Jo, moje funkce, kterou jsem to kdysi davno resil ja, vypadala podobne, akorat tam jeste mela ochranu proti moc velky rekurzi. Prece jenom, nebyl to peknej pohled na ty hnusny errory o stack overflow :-)
AraxoN
AraxoN (neregistrovaný)
20. 4. 2005 10:24 Nový

Re: vypínanie magic_quotes_gpc za behu

celé vlákno
Z princípu do $_GET ani do $_COOKIES sa veľmi dlhé polia nedostanú (jedno aj druhé má obmedzenú veľkosť), takže jedine v $_POST by sa mohli vyskytnúť dáta, na ktorých by to havarovalo... Ale to by ich muselo byť DOSŤ veľa. Nedá sa odoslať taký HTTP request na PHP, ktorý by vygeneroval pole $_* so spätnými referenciami do samého seba (čím by mohli vzniknúť cykly na ktorých by došlo k stack overflow). Obvykle nePOSTujem polia s vnorením väčším než 2, ani dáta o celkovej veľkosti väčšej než pár desiatok kB, takže toto "riešenie" mi postačuje. ;-)
Michal Kubeček
Michal Kubeček (neregistrovaný)
20. 4. 2005 22:02 Nový

Re: vypínanie magic_quotes_gpc za behu

celé vlákno
To není dobrý přístup. Kde berete jistotu, že vám tam někdo nepošle něco mnohem většího (nebo zamotanějšího)? Nebo ty aplikace používáte jen vy sám?
AraxoN
AraxoN (neregistrovaný)
21. 4. 2005 13:38 Nový

Re: vypínanie magic_quotes_gpc za behu

celé vlákno
Existuje niečo ako špecifikácia, a keď sa s klientom dohodneme na tom, že to a to pole bude max takto dlhé, tak klient musí rešpektovať, že v prípade prekročenia limitov je správanie nedefinované. V podstate môžme byť ešte obaja (klient a ja) radi, že sa to sekne hneď na začiatku, a nie niekde uprostred insertovania, deletovania, či updateovania. Anyway. Formulár, do ktorého klient chce narvať viac než 100k dát (nepočítam file upload) je zrelý na rozdelenie na menšie samostatné časti.
Michal Kubeček
Michal Kubeček (neregistrovaný)
21. 4. 2005 21:38 Nový

Re: vypínanie magic_quotes_gpc za behu

celé vlákno
Vy mne děsíte čím dál víc. To opravdu zabezpečujete své aplikace právními doložkami? Připadá mi to jako "ochrana" některých komerčních produktů z poslední doby. Šifrovací algoritmus je sice slaboučký, ale pokusy o jeho prolomení jsme úředně zakázali, takže je to vlastně bezpečné… :-)
Michal Kubeček
Michal Kubeček (neregistrovaný)
18. 4. 2005 0:58 Nový

jde to i bez addslashes()

celé vlákno
Asi by bylo vhodné poznamenat, že u některých databází není v PHP funkce addslashes() potřeba vůbec, protože příslušné PHP rozhraní umožňuje předávat data odděleně od vlastního dotazu. Takový postup je mnohem vhodnější, protože odpadají problémy se zapomenutým nebo dvojitým escapováním a snižují se bezpečnostní rizika, plynoucí z takových opomenutí.
bzuk a strup
bzuk a strup (neregistrovaný)
18. 4. 2005 8:15 Nový

byl sem nalitej jak motyka

celé vlákno
ty vole, ses v pohode vole pod dom
ne ja su tak nazranej ja su jak dobytek
ty vole ja mizim vole tvoje stara
jezisi

jezisi kdes byl, ty ses zas vozralej jak hovado
co me na to reknes ?

DEVKO POSERU TI KOZY!

byl sem nalitej jak motyka, jak motyka, sem se stal
byl sem nalitej jak motyka, jak motyka, jak motyka
byl sem nalitej jak motyka, jak motyka, wunderbar
byl sem nalitej jak motyka, jak motyka, jak motyka

.no tak stara zadny strachy
vim do cecho vrazit prachy
kdyz nevis co z lovama
chlastej pivo s korkama
az se budes domu vracet
a budes na patnik zvracet
poznas ze je to krasnej pozitek
vozrat se jak dobytek

blijeeem

byl sem nalitej jak motyka, jak motyka, rumu par
byl sem nalitej jak motyka, jak motyka, jak motyka
byl sem nalitej jak motyka, kokakola nedobra
byl sem nalitej jak motyka, jak motyka, jak motyka

ja kazdej den jenom piju
alkoholem proste ziju
poznal sem to napoprve
ze promile mam misto krve
uz du zase bumbat slivku
dva rumy si davam k pifku
uz se tesim jak se pobavim
az to vsechno zase vydavim

byl sem nalitej jak motyka, jak motyka, interspar
byl sem nalitej jak motyka, jak motyka, jak motyka
byl sem nalitej jak motyka, kokakola satan zlo
byl sem nalitej jak motyka, jak motyka, jak motyka

musim se jit vychcat
musim se jit vychcat
sem jako houba nasatej
tak musim se jit vychcat

byl sem nalitej jak motyka, jak motyka, zplundrovan
byl sem nalitej jak motyka, jak motyka, jak motyka
byl sem nalitej jak motyka, kokakola satan zlo
byl sem nalitej jak motyka, jak motyka, jak motyka
uživatel si přál zůstat v anonymitě
18. 4. 2005 8:52 Nový

Re:
byl sem nalitej jak motyka

celé vlákno
a pak ze jsou morcata lokalni zalezitost :]
benghi
benghi (neregistrovaný)
29. 4. 2007 0:40 Nový

Re: byl sem nalitej jak motyka

celé vlákno
Hlavní, že neskočíš do bazéééna!
Kamil Podlešák aura:100
18. 4. 2005 10:07 Nový

htmlentities

celé vlákno
Ještě tam chybí zmínka o funkci htmlentities. Tedy o tom, že je by se jí měl každý velkým obloukem vyhnout.
Když se použije při generování HTML, tak ještě moc velkou škodu nenadělá. Ale občas ji někdo použije při generování XML :-(
llook aura:100
18. 4. 2005 11:24 Nový

stripslashes

celé vlákno
Pokud používáte magic_quotes_gpc, pak musíte vždy pamatovat na stripslashes pokud vstup například vypisujete, ukládáte do souboru, posíláte mailem apod.
Zvlášť nepříjemný to je u formulářů, které po server-side validaci nabídnou zpátky formulář se vším co uživatel zadal, ale všechno \"vyslashovaný\".

Je to sice lepší varianta, než kdybychom měli magic_quotes_gpc vypnutý a zapoměli addslashes, ale s tímto přístupem bychom mohli zavést i automatické htmlspecialchars a rawurlencode.
Prostě prosazuji zásadu slashovat jen to co je potřeba!
jkt
jkt (neregistrovaný)
19. 4. 2005 17:26 Nový

Re: stripslashes

celé vlákno
zdravime root.cz :-)
uživatel si přál zůstat v anonymitě
21. 4. 2005 12:11 Nový

Re: stripslashes

celé vlákno
text
petr andrs aura:40
22. 4. 2005 22:15 Nový

escaspovani je cunarna, navazování proměnných vám nic neříká.

celé vlákno
Teda přátelé, to stím escapováním dat před ukládáním myslíte vážně? Není bezpečnějčí, elegantnější a "blbuvzdornější" použití navazování proměnných (omlouvám se překlad). Lepení vstupu do sql je kořenem všeho zla, použijte navazování proměnných. Viz. ospověď z jedné renomované databázové poradny:


oh, defending against SQL injection is trivial!!! really, it is.

Just never accept inputs from the end user that you glue into a sql
statement.

That's it -- never have something passed to you from the outside (outside YOUR
CODE) that becomes part of the query! SQL injection = thing of the past.

It is not dynamic sql that is the issue (all sql is dynamic in Oracle actually
-- even static sql in pro*c/plsql!). It is "the construction" of this sql that
is the problem.


If a user gives you inputs - they should be BOUND into the query -- not
concatenated. The second you concatenate user input into your SQL -- it is as
if you gave them the ability to pass you code and you execute that code. Plain
and simple.

Don't concatenate, but rather bind their inputs, and wah-lah, you are done.


The way to prevent it is via coding standards and design review. And -- best of
all -- at the end of the day, we achieve that nirvana that is "the applications
use binds!"
Michal Kubeček
Michal Kubeček (neregistrovaný)
22. 4. 2005 22:19 Nový

Re: escaspovani je cunarna, navazování proměnných vám nic neříká.

celé vlákno
Nelze než souhlasit, ale nepsal jsem tu v podstatě to samé už 18.4. v 0:58? :-)
petr andrs aura:40
22. 4. 2005 22:23 Nový

Re: escaspovani je cunarna, navazování proměnných vám nic neříká.

celé vlákno
Ano, jinými slovy. Pokud nás bude víc, třeba je přesvědčíme. Bohužel jsem se ke svým oblíbeným webům dostal v tomto týdnu až dnes.
alien2
alien2 (neregistrovaný)
2. 5. 2005 9:57 Nový

Re: escaspovani je cunarna, navazování proměnných vám nic neříká.

celé vlákno
Ja to asi uplne nechapu... Moh by tady nekdo uvest ukazku tohodle postupu? Dik!
Jakub Vrána aura:61
2. 5. 2005 10:07 Nový

Re: escaspovani je cunarna, navazování proměnných vám nic neříká.

celé vlákno
Myslí se tím nemíchání SQL dotazů s daty. Některé extenze (např. MySQL) to přímo nepodporují, jiné ano (např. MySQLi), existují také knihovny, které to zařídí (např. PEAR::DB). Kód pak může vypadat nějak takhle:

$stmt = $mysqli->prepare("SELECT * FROM tabulka WHERE nazev = ? OR id = ?");
$stmt->bind_param("si", $_GET["nazev"], $_GET["id"]);
$stmt->execute();

Žádné addslashes() pak není potřeba.
alien2
alien2 (neregistrovaný)
2. 5. 2005 10:09 Nový

Re: escaspovani je cunarna, navazování proměnných vám nic neříká.

celé vlákno
Hmmm, to je fajn, dik za info!
Zasílat nově přidané příspěvky e-mailem