Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Najbezpieczniejszy sposób na filtrację danych z formularza
Majkelo23
post 14.05.2012, 12:16:25
Post #1





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

Ostrzeżenie: (0%)
-----


Jakimi funkcjami powinno się przepuszczać dane z formularza, które później lecą do bazy? Czy zapis:



to zły zapis? wiem, że jest coś takiego jak mysql_real_escape() i inne, bo czytałem w necie i ktoś własnie użył sformułowania i inne. I dlatego pytam, jakie inne funkcje pomogą jeszcze przy filtracji danych? Jak jest najbezpieczniej filtrować dane?
Go to the top of the page
+Quote Post
viking
post 14.05.2012, 12:19:33
Post #2





Grupa: Zarejestrowani
Postów: 6 376
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Przepuszczać przez preg_match, filter_vars, rzutować typy. mysql_* sobie odpuść na rzecz PDO i bindowania parametrów. W jaki sposób wycięcie białych znaków miało by pomóc?


--------------------
Go to the top of the page
+Quote Post
bostaf
post 14.05.2012, 21:38:53
Post #3





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


Najlepiej żadnymi. A jeśli już, to specjalnie do tego przeznaczonymi.

Jeśli będziesz używał rozszerzenia PDO, to możesz w ogóle zapomnieć o filtrowaniu i spokojnie spać. Za pomocą tzw. prepared statements możesz wysłać dane bezpośrednio z formularza do bazy nie martwiąc się, czy dane - intencjonalnie lub nieintencjonalnie - zawierają potencjalnie niebezpieczne znaki lub kod:
  1. $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
  2. $zapytanie = $dbh->prepare("INSERT INTO `moja_tabela`(`pole1`, `pole2`) VALUES (:zmienna1, :zmienna2)");
  3. $zapytanie->bindParam(':zmienna1', $_POST['zmienna_1']);
  4. $zapytanie->bindParam(':zmienna2', $_POST['zmienna_2']);
  5. $zapytanie->execute();

W ten sposób dane podane przez użytkownika znajdą się w tabeli w takiej formie, w jakiej zostały podane przez użytkownika, nie wpływając w żaden sposób na konstrukcję samego zapytania. Inaczej mówiąc, PDO uniemożliwia przeprowadzanie ataków SQL Injection.

Rozszerzenie PDO jest rekomendowane do obsługi połączeń z bazą danych w przypadku PHP 5.*. Jeśli używasz starszych wersji PHP, to filtrowanie danych z formularzy możesz prosto załatwić jedną funkcją rozszerzenia mysqli - mysqli_real_escape_string:
  1. $dbh = mysqli_connect("localhost", $user, $password, "test");
  2. $zmienna1 = mysqli_real_escape_string($dbh, $_POST['zmienna_1']);
  3. $zmienna2 = mysqli_real_escape_string($dbh, $_POST['zmienna_2']);
  4. mysqli_query($dbh, "INSERT INTO `moja_tabela`(`pole1`, `pole2`) VALUES ('$zmienna1', '$zmienna2')")

Funkcja mysqli_real_escape_string jest specjalnie przeznaczona do filtrowania łańcuchów używanych w zapytaniach SQL.

Zapis, który podałeś jest zły bo:
  1. Używa funkcji nieprzeznaczonych do filtrowania łańcuchów w zapytaniach SQL,
  2. Zmienia wartość danych przesyłanych przez użytkownika.

Co do 1 - już wiesz, o co chodzi. Co do 2 - nie chcemy zmieniać danych użytkownika. Chcemy, żeby te dane nie były niebezpieczne. Najlepiej zapisywać dane tak, jak są podane i formatować je na wyjściu. Formatowanie wejścia oznacza dodatkowe problemy przy formatowaniu wyjścia.
Go to the top of the page
+Quote Post
Crozin
post 14.05.2012, 21:54:30
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@bostaf: Przecież mysqli wspiera prepared statements, po co się babrać z ręcznym sklejaniem zapytań.

Ten post edytował Crozin 14.05.2012, 21:54:54
Go to the top of the page
+Quote Post
bostaf
post 14.05.2012, 22:27:40
Post #5





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


@Crozin No racja. Też bym takiego babrania nikomu nie polecał. Ale ze względów edukacyjnych dobrze wspomnieć o takich metodach. Zwłaszcza, że może przyjść czas, że taka wiedza się przyda. A każdy moment jest dobry, żeby czegoś nowego albo starego się nauczyć.
Go to the top of the page
+Quote Post
viking
post 15.05.2012, 05:23:47
Post #6





Grupa: Zarejestrowani
Postów: 6 376
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Dlatego są zazwyczaj 2 etapy przygotowania danych: filtracja i walidacja. Filtracja na wstępie eliminuje niepożądane znaki (czyli tutaj idealnym przykładem może być właśnie trim), walidacja sprawdza ich poprawność. Dopiero po tym dane wrzucamy do bazy.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.05.2025 - 06:45