Autor Zpráva
Leo3
Profil
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
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
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
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
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
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();
A v premennej $name je vstup od uzivatela. No a snazim sa odfiltrovat pripadne skodlive znaky. Cize aby uzivatel v inpute nezadal nejaky prikaz. No a otazka znie ako, alebo ktore znaky treba filtrovat.

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
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()
Tedy snad. Symfony a Propel nepoužívám, ale podle dokumentace by to tak mělo být. Odpovídá to i jiným ORM systémům. No a escapování si bude řešit někde uvnitř po svém, takže se o to taky nemusíš starat.
Leo3
Profil
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
Aha tak, takze netreba filtrovat ziadne znaky. A bude to bezpecne?
Tomášeek
Profil
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
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()
Myslím si, že je to dost nebezpečný řetězec. Kdyby se přímo vložil do dotazu, pak by ho měl rozbít a do databáze by se nic nevložilo. Pokud to ORM nepsal nějaký patlal, pak by mělo být vše v pořádku a jen se to bezpečně uloží do databáze.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: