Názory k článku
PHP okénko: Escapování
kdy escapovat
celé vláknoBTW chape nekdo popis urlencode v PHP manualu, myslim ten konec o htmlentities? IMHO z urlencode vzdycky vyleze jenom
a-zA-Z0-9-_.+
ne?
Re: kdy escapovat
celé vláknoRe: kdy escapovat
celé vláknohtmlentities(urlencode($userinput))
a ja se ptam: kdy muze z urlencode() vylizt neco, co htmlentities() zkonvertuje? IMHO nikdy, ne?
Re: kdy escapovatRe: kdy escapovat
celé vláknoRe: kdy escapovatRe: kdy escapovat
celé vláknoRe: kdy escapovatRe: kdy escapovat
celé vláknoRe: kdy escapovat
celé vláknoproč ne htmlencode předem
celé vláknoRe: proč ne htmlencode předem
celé vlákno<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).
CHYBKA ROOTu pri vkladani textu
celé vlákno\"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()). :-(
Re: CHYBKA ROOTu pri vkladani textu
celé vlákno1 or true ... a pokud to ma v uvozovkach tak treba:
' or ''='
;]
Re: CHYBKA ROOTu pri vkladani textu
celé vláknoRe: proč ne htmlencode předem
celé vláknoAle 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.
Re: proč ne htmlencode předem
celé vláknoRe: proč ne htmlencode předem
celé vláknoHří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ě).
Re: vypínanie magic_quotes_gpc za behu
celé vlákno/**
* 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);
}
Re: vypínanie magic_quotes_gpc za behu
celé vláknoRe: vypínanie magic_quotes_gpc za behu
celé vlákno1) 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
Re: vypínanie magic_quotes_gpc za behu
celé vláknoRe: vypínanie magic_quotes_gpc za behu
celé vláknoRe: vypínanie magic_quotes_gpc za behu
celé vláknoRe: vypínanie magic_quotes_gpc za behu
celé vláknoRe: vypínanie magic_quotes_gpc za behu
celé vláknojde to i bez addslashes()
celé vláknoaddslashes() 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í.
byl sem nalitej jak motyka
celé vláknone 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
Re:
byl sem nalitej jak motyka
celé vlákno
Re: byl sem nalitej jak motyka
celé vláknohtmlentities
celé vláknoKdyž 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 :-(
stripslashes
celé vláknoZvlášť 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!
escaspovani je cunarna, navazování proměnných vám nic neříká.
celé vláknooh, 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!"
Re: escaspovani je cunarna, navazování proměnných vám nic neříká.
celé vláknoRe: escaspovani je cunarna, navazování proměnných vám nic neříká.
celé vláknoRe: escaspovani je cunarna, navazování proměnných vám nic neříká.
celé vláknoRe: escaspovani je cunarna, navazování proměnných vám nic neříká.
celé vlákno$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.

