IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 15. diel - Tvorba knižníc v PHP

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
mapak
Člen
Avatar
mapak:20.1.2014 9:14

Ahoj! Opět super díl super seriálu! Jen si dovolím poznámku k prvnímu příkladu - Knihovna pro práci s emaily. Deklarace proměnné $predmet uvnitř funkce je tam trochu navíc, když ji uživatel zadává jako parametr.

 
Odpovedať
20.1.2014 9:14
Avatar
jnao01
Člen
Avatar
jnao01:29.1.2014 19:22

Zdravím,
celkom pekný tutoriál a už idem na ďalší, len som chcel upozorniť na chybu v kóde v analyza.php.

 echo('<tr><td>Samohlásek</td><td>' . htmlspecialchars($samohlasek) . '</td></tr>');
echo('<tr><td>Samohlásek</td><td>' . htmlspecialchars($souhlasek) . '</td></tr>');

V tom druhom má byť Souhlasek a ty tam máš v oboch Samohlásek. ;)

Editované 29.1.2014 19:23
 
Odpovedať
29.1.2014 19:22
Avatar
jnao01
Člen
Avatar
jnao01:29.1.2014 19:29

Ešte som sa chcel opýtať prečo používaš funkciu

htmlspecialchars($samohlasek)

nestačilo by tam dať len premennú?

$samohlasek
Editované 29.1.2014 19:29
 
Odpovedať
29.1.2014 19:29
Avatar
Odpovedá na jnao01
Michal Žůrek - misaz:29.1.2014 19:30

je to kvůli injekci, uživatel by ti tam mohl napsat script.

 
Odpovedať
29.1.2014 19:30
Avatar
Kubo2
Nevyplnené
Avatar
Kubo2:31.1.2014 10:52

Chcel by som autora upozorniť na zbytočný balast v kóde súboru analyza.php (teďka pozerám, že už na to ktosi upozornil) – pri vypisovaní premenných $samohlasek a $souhlasek sú zbytočne prehnané funkciou na ošetrovanie prípadného HTML vstupu od užívateľa + ich datový typ je integer, pretože to je iba výsledok nejakej operácie so vstupom, takže na nich nie je čo ošetrovať :-)

 
Odpovedať
31.1.2014 10:52
Avatar
Odpovedá na Michal Žůrek - misaz
Libor Šimo (libcosenior):31.1.2014 11:07

Misaz, verím, že je to možné, ale mohol by si prosím uvieť nejaký konkrétny príklad injekcie?

Odpovedať
31.1.2014 11:07
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na
David Hartinger:31.1.2014 11:15

Ošetřovat je třeba všechny proměnné těsně před výpisem. V PHP si typem nikdy nemůžeš být jistý a stejně tak si nemůžeš být jistý co se v té proměnné objeví za hodnotu. Že by to zrovna v tomto případě nevadilo neznamená, že se to nemá ošetřovat, určitě to není balast.

Odpovedať
31.1.2014 11:15
New kid back on the block with a R.I.P
Avatar
mkub
Tvůrce
Avatar
Odpovedá na
mkub:31.1.2014 11:49

ako sdraco pise, treba premenne testovat pred vypisom, vylucne vsetky tie, do ktorych sa zaznamenavaju vstupy uzivatela (hovori ti nieco cross site scripting, resp. SQL injection?)

 
Odpovedať
31.1.2014 11:49
Avatar
Kubo2
Nevyplnené
Avatar
Odpovedá na David Hartinger
Kubo2:31.1.2014 20:23

sdraco:

S tým, čo si napísal, rozhodne nemôžem súhlasiť. Ošetrovať stačí vždy iba tie vstupy, ktoré si získal (to je jedno kedy, či týmto konkrétnym požiadavkom alebo hociktorým predchádzajúcim) priamo od používateľa, kedy si nemôžeš byť vôbec istý tým, čo ti od neho príde (úplne najmenej, čo by si mal urobiť, ak chceš so vstupom pracovať, je otestovať, či vôbec existuje, resp. či je prázdny; pri type dát posielaných z formulára, t.j. application/x-www-form-urlencoded je teoreticky vhodné zároveň testovať, či je premenná reťazec, pretože pridaním [] za názov posielanej premennej z nej môže používateľ vytvoriť v PHP pole).

Ďaľšia vec, v PHP si typom môžeš byť práve taký istý ako príkladne v C#, Jave či Pythone. Vo funkcii pocetZnaku si inicializuješ premennú $pocet hodnotou 0. Táto hodnota je typu integer. Premenná, do ktorej zmienenú hodnotu ukladáš, je rovnež tohoto typu (ako iste vieš, v PHP nadobúda premenná typ podľa toho, čo do nej uložíš). V kontexte tejto funkcie túto premennú nikde nepretypuješ ani do nej nepriraďuješ hodnotu iného typu. Funkcia vráti jej hodnotu typu integer. V obidvoch funkciách pocetSamohlasek aj pocetSouhlasek (slovensky spoluhlások) priamo vraciaš návratovú hodnotu funkcie pocetZnaku, žiadnym spôsobom ju nemodifikuješ. Povedz mi jediný dôvod, prečo by si si nemal byť istý, že pri zavolaní jednej z týchto troch funkcií ti vrátia hodnotu typu integer?

Hodnotou, narozdiel od typu, si nemôžeš byť istý v žiadnom programovacom jazyku, takže tento argument sa mi javí ako bezpredmetný.

Že to nie je balast? Tak balast to určite je, to ti teda poviem. Hľadiac na tvoje argumenty ťa radím medzi tých ľudí, ktorí prehnane (a zbytočne) ošetrujú všetko, čo sa týka I/O, pretože nepochopili správne (alebo vôbec) dôvody, prečo, kedy a ako sa dáta majú ošetrovať.
Totiž stačí si uvedomiť, že napríklad vstupy, ktoré sa chystáme uložiť a vypisovať, je potrebné takmer vždy ošetriť proti tomu, aby užívateľ mohol do tohoto vstupu (a následne na výstup) vpisovať rôzne HTML značky.
Keď máme zase vstup, ktorý chceme použiť do SQL dotazu, musíme ho ošetriť prednostne escapovaním apostrofov, aby si užívateľ nemohol dopísať vlastný SQL dotaz.
A tak ďalej. Existujú zástupy konkrétnych situácií, v ktorých sa vstup ošetruje vždy špecificky (keď chcem vypisovať dáta na stránku, nebudem ich ošetrovať proti SQL Injection).

Môj predošlý komentár bol reakciou na to, že si v podstate úplne zbytočne ošetril číslo, ktoré vôbec ošetrovať nebolo potrebné - získal si ho totiž od vlastnej funkcie, v ktorej si môžeš byť istý tým, čo do nej napíšeš. Ak si tým istý nie si, vráť sa k základom PHP.

Nakoniec otázka trošku mimo témy: Kto ťa učil informatiku na Unicorn College? Respektíve kto ťa učil PHP?

mkub:

Sakra, vy dvaja s sdracom si fakt pekne protirečíte. Aký vstup používateľa sa zaznamenáva do premenných $znaku, resp. $samohlasek, resp. $souhlasek?

XSS a SQL Injection samozrejme poznám. Keďže programujem prevažne v PHP, kde sa človek pomerne často potýka s databázami a hlavne sa v ňom programujú webové aplikácie, stáva sa to mojou cirka každodennou kávou ;-)

 
Odpovedať
31.1.2014 20:23
Avatar
Jiří Jeřábek (thechorcheecz):15.3.2014 0:01

Zdravím, super tutoriál, jen bych se chtěl zeptat takovou maličkost, jak by se ta věta, kterou napíšeme ještě vypsala nadto? abychom viděli co jsme napsali za větu a nadtím počet znaků,atd...
Díky moc

 
Odpovedať
15.3.2014 0:01
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!