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
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
Post #2





Grupa: Zarejestrowani
Postów: 6 381
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
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
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
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
Post #6





Grupa: Zarejestrowani
Postów: 6 381
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
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 08:46