Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]funkcja do pól typu text
Forum PHP.pl > Forum > Przedszkole
wpaski
Czy taka funkcja zabezpiecza dane które mają być zapisywane do bazy danych? Dodatkowo korzystam z PDO.
  1.  
  2. public function allowedcharacters($data) {
  3. $data = filter_var($data, FILTER_SANITIZE_STRING);
  4. if (preg_match("/^[a-z ęóąśłżźćń]+$/", $data) == false) {
  5. return "Niedozwolone znaki";
  6. }
  7. }


Takie jeszcze poboczne pytanie co dokładnie robi flaga FILTER_SANITIZE_STRING bo z tego co wyczytałem, to usuwa znaki html'owskie ale co jeszcze usuwa?
JoShiMa
A duże litery i znaki przestankowe? Cyfry też wykluczasz?
wpaski
tak w tym polu akurat tak miało być, w innych gdzie to wymagane to może zrobić takie coś?
  1. str_replace(array('\\','[',']','^','$','.','|','?','*','+','(',')'),array('\\\\','\[','\]','\^','\$','\.','\|','\?','\*','\+','\(','\)'),$data);

czy poprostu dać addslashes?
b4rt3kk
Hmm, myślę, że nie ma co wymyślać koła na nowo, funkcje których potrzebujesz już są dostępne w PHP, tak jak mówiłeś addslashes, ale także strip_tags chociażby.
viking
@b4rt3kk: wpaski używa filter_var oraz jak mówił PDO więc zdradź co mają dwie propozycje mu dać?
Jak już to htmlentities oraz http://htmlpurifier.org/
bostaf
Cytat(wpaski @ 7.10.2012, 14:24:08 ) *
Czy taka funkcja zabezpiecza dane które mają być zapisywane do bazy danych? Dodatkowo korzystam z PDO.
  1.  
  2. public function allowedcharacters($data) {
  3. $data = filter_var($data, FILTER_SANITIZE_STRING);
  4. if (preg_match("/^[a-z ęóąśłżźćń]+$/", $data) == false) {
  5. return "Niedozwolone znaki";
  6. }
  7. }

Zabezpiecza? W sensie przed SQL injection? Nie, nie zabezpiecza. Przed wprowadzeniem do bazy innych niż litery i spacja znaków? Tak. Tzn. sama w sobie nie, ale jeśli będzie odpowiednio użyta z funkcją wywołującą zapytanie to tak. Naprawdę masz konieczność takiego ograniczania znaków?
Jeśli chodzi tylko o ochronę przed SQL injection to PDO::prepare w połączeniu z PDOStatement::bindParam jest absolutnie wystarczające, bo zostało stworzone w celu zabezpieczenia przed takim atakiem. Nie trzeba danych dodatkowo filtrować.
Co masz dokładnie na myśli pisząc o zabezpieczaniu?

Cytat(wpaski @ 7.10.2012, 14:24:08 ) *
Takie jeszcze poboczne pytanie co dokładnie robi flaga FILTER_SANITIZE_STRING bo z tego co wyczytałem, to usuwa znaki html'owskie ale co jeszcze usuwa?

Tu masz opis wszystkich filtrów: http://www.php.net/manual/en/filter.filters.php. FILTER_SANITIZE_STRING cytuję: "Strip tags, optionally strip or encode special characters." czyli czyści tagi, opcjonalnie czyści lub koduje specjalne znaki. Żeby filtrował te opcjonalne znaki, trzeba dodać odpowiednią flagę (z kolumny "flags" na listingu).
wpaski
dzięki, chodzi o podstawowe ataki, SQL injection i XSS

Cytat
Tzn. sama w sobie nie, ale jeśli będzie odpowiednio użyta z funkcją wywołującą zapytanie to tak.


Tego za bardzo nie rozumiem, przecież nie można wprowadzić innych znaków po za tymi filtrowanymi przez preg_match
bostaf
Cytat(wpaski @ 7.10.2012, 16:28:10 ) *
dzięki, chodzi o podstawowe ataki, SQL injection i XSS

No to sprawa jest prosta. Do skonstruowania zapytania wykorzystaj PDO::prepare, podepnij dane za pomocą PDOStatement::bindParam i wykonaj zapytanie za pomocą PDOStatement::execute. Nic nie trzeba filtrować ani eskejpować. Wszystkie dane są "podpięte" czyli lecą do servera SQL równolegle z zapytaniem a nie w zapytaniu. W tym cała magia PDO - dane nie mają bezpośredniego kontaktu z zapytaniem.
W manualu PHP, za linkami które podałem, są ładne przykłady bindowania.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.