Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]preg_match i apostrof
djtomaszq
post
Post #1





Grupa: Zarejestrowani
Postów: 192
Pomógł: 0
Dołączył: 5.07.2015

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


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).
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
emstawicki
post
Post #3





Grupa: Zarejestrowani
Postów: 207
Pomógł: 40
Dołączył: 2.06.2016
Skąd: Olsztyn

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


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.


--------------------
Jak w Olsztynie, to tylko w Revolver Rock Cafe .
Sprawdź postęp propagacji DNS
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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.
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@Pyton o widzisz smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
djtomaszq
post
Post #7





Grupa: Zarejestrowani
Postów: 192
Pomógł: 0
Dołączył: 5.07.2015

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


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 - ?
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
djtomaszq
post
Post #9





Grupa: Zarejestrowani
Postów: 192
Pomógł: 0
Dołączył: 5.07.2015

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


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... (?)
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
djtomaszq
post
Post #11





Grupa: Zarejestrowani
Postów: 192
Pomógł: 0
Dołączył: 5.07.2015

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


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

Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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 Aktualny czas: 21.08.2025 - 06:30