Autor | Zpráva | ||
---|---|---|---|
Leo3 Profil |
#1 · Zasláno: 12. 7. 2017, 14:38:37
Chcem sa opytat pri php aplikacii, ktora nacitava data vo formulari od uzivatela a zapisuje do databazy cez PDO.
Ake znaky/retazce by bolo vhodne filtrovat proti pripadnemu utoku, sql injection. Testujem vstupy na konkretne typy, cize int na int, datum na date. Pri stringoch filtrujem konkretne znaky. Zatial filtrujem nasledovne: "'", "::", ";", "--", "=", "<", ">" Rozmyslal som nad $, no neviem ci nebude zadavany pri niektorych udajoch. Bolo by este vhodne nejake filtrovat? |
||
pcmanik Profil |
#2 · Zasláno: 12. 7. 2017, 15:11:28
Leo3:
V PDO treba používať prepared statement a nefiltrovať to ručne. Viac si prečitaj v Definitívnej príručke k escapovaniu. |
||
Leo3 Profil |
#3 · Zasláno: 12. 7. 2017, 17:13:58
V tom clanku pisu ze eskejpovanie znakov riesi PDO same.
Doporučuji používat databázový layer (např. dibi, PDO) nebo parametrické dotazy, které escapování obstarají za vás. Tak to eskejpovanie zrejme nemusim riesit. Robim to v Symfony. A co pouzitie filter_var()? Je to ok? Priklad Len to odfiltruje aj znaky, ktore potrebujem. |
||
Tomášeek Profil |
#4 · Zasláno: 12. 7. 2017, 17:17:57
Leo3:
Na uvedených znacích/sekvencích znaků není nic nebezpečného, pokud je do DB neukládáš jako tatar, tedy bez příslušného ošetření (tím nemyslím tyto znaky odebrat). Záleží, jaká pole uživatel vyplňuje. Nyní třeba tyhle znaky skutečně nepotřebuješ, ale až budeš příště ukládat HTML? Obsah zprávy z textarey, kde použiju rovnítko buď v matematickém, nebo jiném smyslu? Tudy cesta nevede, ošetřuj všechny dotazy bez ohledu na to, jaká data v nich mají správně být (to ošetřuj taky, ale jinde a jinak). EDIT: filter_var slouží k validaci dat, třeba e-mailové adresy, ale nikoliv k escapování vstupu do DB.
Zapomeň na to, že nějaké filtrování ( str_replace ?) existuje. Na validaci dat používej validační funkce (nejen pro e-mail např. zmíněný filter_var, v jiném případě jinou fci), pro ukládání do DB hledej „escapování“. Možná spíš ukaž, jak se snažíš ta data do DB vkládat, zatím nevíme, co a jak vlastně zkoušíš.
|
||
Keeehi Profil |
#5 · Zasláno: 12. 7. 2017, 17:56:53
Leo3:
„V tom clanku pisu ze eskejpovanie znakov riesi PDO same.“ Ano, escapování se v PDO řeší samo, takže se o to nemusíš starat. Prostě tomu předáš data tak, jak ti je uživatel dal a ony se správně uloží do databáze. Ovšem pozor! Musíš použít výše zmíněné prepared statements. Pokud to naprasíš přímo do dotazu, tak se žádné escapování konat nebude, protože to ani nebude možné. |
||
Leo3 Profil |
#6 · Zasláno: 12. 7. 2017, 18:49:59
Tomášeek:
Robim to v Symfony cez Propel. Spravil som si jednoducho schema.xml podla databazy MySQL a spustil prikaz php app/console propel:model:build
No a uz len pouzivam fcie, ktore vytvorilo pre pristup k databaze. Napr. $User = new User(); $User->setNAME($name); $User->getNAME(); Treba pouzit prepare statements, ok. No a ako to pouzijem? Nechapem. Kam do tohto kodu vlozim $name? <?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // insert one row $name = 'one'; $value = 1; $stmt->execute(); // insert another row with different values $name = 'two'; $value = 2; $stmt->execute(); ?> |
||
Keeehi Profil |
#7 · Zasláno: 12. 7. 2017, 20:22:19
Leo3:
Proč pouziváš ORM? No přece aby jsi se nemusel vůbec zabývat SQL dotazy. Takže jak vložit do databáze nový řádek? $User = new User(); $User->setNAME($name); $User->save() |
||
Leo3 Profil |
#8 · Zasláno: 12. 7. 2017, 21:37:55
No jasne, vsak ukladanie do databazy mi funguje :)
Len snazim sa filtrovat znaky, aby do setNAME() nevstupovali niektore znaky. Zatial filtrujem nasledovne: "'", "::", ";", "--", "=", "<", ">". A chcel by som vediet ze ci je vhodne filtrovat este nejake dalsie znaky. No a bolo mi poradene, ze mam pouzit prepare statements, to ale neviem ako mam pouzit. |
||
pcmanik Profil |
Leo3:
Escapovanie sa robí same (resp. ho robí Propel), čo na tom nerozumieš? Žiadne znaky teda nemáš prečo filtrovať. Prepared statement som ti poradil preto, lebo podľa prvého príspevku to vyzeralo že používaš PDO a nie ORM systém. |
||
Leo3 Profil |
#10 · Zasláno: 13. 7. 2017, 08:53:12
Aha tak, takze netreba filtrovat ziadne znaky. A bude to bezpecne?
|
||
Tomášeek Profil |
#11 · Zasláno: 13. 7. 2017, 09:24:08
Leo3:
„takze netreba filtrovat ziadne znaky.“ Samozřejmě. Jak jinak by se podle tebe ukládalo třeba HTML do databáze, když bys odstranil všechny závorky? Jak by se uložil tvůj příspěvek obsahující „--“, když je dle tebe tato sekvence nebezpečná a měla by se odstranit? |
||
Keeehi Profil |
#12 · Zasláno: 13. 7. 2017, 10:16:18
Leo3:
„Aha tak, takze netreba filtrovat ziadne znaky. A bude to bezpecne?“ Ano. ORM se (mimo jiné) postará o to, aby jsi mohl do databáze bezpečně uložit jakoukoli kombinaci znaků. Vždyť si to můžeš i sám ověřit. $User = new User(); $User->setNAME("'a ` -- a"); $User->save() |
||
Časová prodleva: 6 let
|
0