Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]preg_match i apostrof
Forum PHP.pl > Forum > Przedszkole
djtomaszq
Używam sprawdzenia w rejestracji:
  1. if(!preg_match("@^[a-zA-Z0-9_-]+$@",$login))
  2. {
  3. $flaga = false;
  4. }


używam zmiennej login w zapytaniu
  1. $rezultat = $polaczenie->query("SELECT id_users FROM users WHERE login = '$login'");


Jak wpisze w loginie string z apostrofem w liczbie pazystej wyskakuje:
  1. Exception: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'd'dsd'' at line 1 in


Czy preg_match przepuszcza apostrofy czy czegoś nie rozumiem ? (Pewnie to drugie).
nospor
1) Na chwile obecna nigdzie nie sprawdzasz czy $flaga to true czy false.
2)
nie [a-zA-Z0-9_-]
a [a-zA-Z0-9_\-]
- to znak specjalny.

3) Dane wkladane to zapytania tak czy siak wypadaloby by ESCAPOWAC a juz najlepiej BINDowac.
emstawicki
preg_match nie jest dobrym narzędziem do filtrowania zmiennych zewnętrznych, które użyjesz w zapytaniu.
Poczytaj o trim, stripslashes, htmlspecialchars oraz wstrzykiwaniu szkodliwego zapytania SQL.
nospor
@emstawicki no z calym szacunkiem ale jest lepsze od funkcji ktore ty wymieniles.

Poprawnosc loginu jak najbardziej trzeba sprawdzac jak kazdych innych pol. Zas co do escapowania to juz napisalem czego sie powinno uzyc. Funkcje ktore wymieniles tutaj sa totalnie zbedne i nie temu sluza
Pyton_000
Cytat(nospor @ 19.09.2016, 10:52:44 ) *
2)
nie [a-zA-Z0-9_-]
a [a-zA-Z0-9_\-]
- to znak specjalny.


Może się czepam ale nie jeśli występuje na końcu wink.gif

Cytat
The minus (hyphen) character can be used to specify a range of characters in a character class. For example, [d-m] matches any letter between d and m, inclusive. If a minus character is required in a class, it must be escaped with a backslash or appear in a position where it cannot be interpreted as indicating a range, typically as the first or last character in the class.
nospor
@Pyton o widzisz smile.gif
djtomaszq
Czyli jeśli chce aby login zawierał a-z 0-9 i "_" i "-"
1. to mam nie używać preg_match czy mam użyć tych funkcji trim strip.. html.. i dodatkowo preg_match żeby wyodrębnić _ i - ?
nospor
zapomnij o tych trzech funkcjach co podal mstawicki. One nie do tego sluza.

preg_match jest jak najabrdziej ok. Tylko pytanie, czy ty to potem poprawnie uzywasz tej $flaga
djtomaszq
tak używam poprawnie (tzn wszystko działa po za tymi apostrofami) bo nie chciałem stu linijek kodu wysyłać ogólnie sprawdzam flage tak:
  1. if(isset($_POST['submit']))
  2. {
  3. $flaga = true;
  4. //Sprawdzanie poprawności loginu np. ile znaków
  5. ....
  6. if(!preg_match("@^[a-zA-Z0-9_\-]+$@",$login))
  7. {
  8. $flaga = false;
  9. }
  10. //Sprawdzanie e-mail hasla
  11. ........
  12. try{
  13. if($polaczenie->connect_errno != 0)
  14. {
  15. throw new Exception($polaczenie->mysqli_connect_errno());
  16. }else
  17. {
  18. //Sprawdzenie czy istnieje e-mail
  19. $rezultat = $polaczenie->query("SELECT id_users FROM users WHERE email = '$email'");
  20.  
  21. if(!$rezultat) throw new Exception($polaczenie->error);
  22.  
  23. $ile_mail = $rezultat->num_rows;
  24. if($ile_mail > 0)
  25. {
  26. $flaga = false;
  27. $_SESSION['e_email'] = trans('key23');
  28. }
  29.  
  30. //Czy istnieje taki Login
  31. $rezultat = $polaczenie->query("SELECT id_users FROM users WHERE login = '$login'");
  32.  
  33. if(!$rezultat) throw new Exception($polaczenie->error);
  34.  
  35. $ile_login = $rezultat->num_rows;
  36. if($ile_login > 0)
  37. {
  38. $flaga = false;
  39. $_SESSION['e_login'] = trans('key24');
  40. }
  41.  
  42. //Zapisywanie użytkownika do bazy
  43. if($flaga == true)
  44. {
  45. $data = date('Y-m-d H:i:s');
  46. if($polaczenie->query("INSERT INTO users VALUES (NULL, 1, '$login', '$haslo_hash', '$email', '$data', 50)"))
  47. {
  48. $_SESSION['komunikat'] = trans('key25');
  49. $_SESSION['kolor_kom'] = "succes";
  50. header('Location: '.linkGenerator('logowanie').'');
  51. }else
  52. {
  53. throw new Exception($polaczenie->error);
  54. }
  55. }
  56.  
  57. $polaczenie->close();
  58. }
  59.  
  60. }


ale co zrobić z tym apostrofem którego jak wpisze przy rejestracji wywołuje błąd oczywiści 2 apostrofy nie dają błędu.

Ja to rozumiem tak jakby preg_match apostrof przepuszczało i traktowało jako koniec stringa przy 2 apostrofach jest ok bo traktowany jako pusty tekst... (?)
nospor
Przeciez o to zapytanie
$rezultat = $polaczenie->query("SELECT id_users FROM users WHERE login = '$login'");

odpalasz zawsze niezaleznie czy $flaga jesdt true czy nie :/ To zapytanie masz odpalac tylko gdy $flaga jest TRUE. Od samego poczatku o tym ci mowie.

A konkretnie gdy to
preg_match("@^[a-zA-Z0-9_\-]+$@",$login)
daje true bo $flaga w miedzyczasie utawiasz tez przy innej okazji.

Poza tym zaiteresuj sie BINDowaniem jak juz pisalem to nie bedziesz mial tak glupich bledow zapytan i twoj skrypt bedzie bezpieczny
djtomaszq
ok, przerzuciłem sprawdzenie $flaga przed try i teraz dział bez błędów z '. Dzięki.

Dla pewności zapytam czyli preg_match jest bezpieczne w takiej formie czy ZAWSZE dodatkow w zapytaniach używać BINdowania ? Oczywiście zapomniałem już o tych funkcjach z 3 postu trim html.. itp

nospor
Tak, ZAWSZE masz uzywac bindowania. Bo jak kiedys zmienisz regule w preg_match - bo np. klient sobie zazyczy login z apostrofem, to na 100% zapomnisz ze masz niezabezpieczone zapytanie i beda bledy. Tak wiec lepiej wyrob sobie nawyk 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.