Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]filtrowanie zmiennych z paska adresu
Forum PHP.pl > Forum > Przedszkole
Testosteron
Witam. Napisałem taki oto szkielet skryptu weryfikacji adresu email:

  1. <?php
  2. include('lang\polish.inc');
  3. include('function.inc');
  4. $code = substr($_GET['v'], 0, 10);
  5. $id = substr($_GET['v'], 10);
  6.  
  7. connect();
  8. $weryfikacja = mysql_query("SELECT id, code FROM users WHERE id='" .$id. "' and code='" .$code. "'");
  9. $potwierdzenie = mysql_num_rows($weryfikacja);
  10.  
  11. If($potwierdzenie == 1)
  12. {
  13. $aktywuj = mysql_query("UPDATE users SET activate='1' WHERE id = '" .$id. "'");
  14.  
  15. If ($aktywuj)
  16. {
  17. echo 'Konto zostało aktywowane';
  18. }
  19. else
  20. {
  21. echo 'Wystąpił nieoczekiwany błąd. Nie udało się aktywować konta';
  22. }
  23. }
  24. else
  25. {
  26. echo 'Nieprawidłowy kod aktywacyjny';
  27. }
  28.  
  29. ?>

Kod działa poprawnie. Problem powstaje w momencie, kiedy chcę sprawdzić poprawność zmiennych, np. funkcją is_int. Za każdym razem funkcja zwraca wartość false. Dlaczego tak się dzieje?
b4rt3kk
Bo w tym momencie $code jest stringiem:

  1. $code = substr($_GET['v'], 0, 10);


jak zresztą sam wiesz, bo używasz funkcji substr, czyli wycinasz string ze stringa, gdzie wartość wyjściowa również jest stringiem.

Weryfikacji możesz dokonać za pomocą preg_match:

  1. $pattern = '/^[0-9]{4}$/';
  2. if (preg_match($pattern, $code) == 1) echo 'ok';


gdzie {4} (przykładowo) to długość jaką powinien mieć Twój kod.
bostaf
Cytat(b4rt3kk @ 6.10.2012, 12:31:01 ) *
Weryfikacji możesz dokonać za pomocą preg_match:
  1. $pattern = '/^[0-9]{4}$/';
  2. if (preg_match($pattern, $code) == 1) echo 'ok';


gdzie {4} (przykładowo) to długość jaką powinien mieć Twój kod.


Albo konwertować string do integera za pomocą funkcji intval:

  1. $id = intval(substr($_GET['v'], 10));

Zwróć uwagę, że jeśli konwersja się nie powiedzie to funkcja intval zwróci integer 0, co może być problemem jeśli pole id w Twojej tabeli może przyjmować wartość 0.
b4rt3kk
Cytat(bostaf @ 6.10.2012, 13:02:34 ) *
Albo konwertować string do integera za pomocą funkcji intval:

  1. $id = intval(substr($_GET['v'], 10));

Zwróć uwagę, że jeśli konwersja się nie powiedzie to funkcja intval zwróci integer 0, co może być problemem jeśli pole id w Twojej tabeli może przyjmować wartość 0.


Nie sądzę by w tym przypadku konwersja do int spełniała swoją rolę, bo to nie zweryfikuje danych z GET. Jeśli użytkownik spreparuje link i da np. 12rt6897 to konwersja do int zwróci 12.
Testosteron
Dzięki za pomoc, tylko nie rozumiem jednego. Jeżeli przesyłam dane z formularza to bezproblemowo mogę użyć funkcji is_int
Cytat
Nie sądzę by w tym przypadku konwersja do int spełniała swoją rolę, bo to nie zweryfikuje danych z GET. Jeśli użytkownik spreparuje link i da np. 12rt6897 to konwersja do int zwróci 12.

Z drugiej jednak strony jeżeli funkcja utnie część kodu spreparowanego przez użytkownika to kod będzie niekompletny i na którymś etapie także zostanie zgłoszony błąd
bostaf
Cytat(b4rt3kk @ 6.10.2012, 13:12:16 ) *
Nie sądzę by w tym przypadku konwersja do int spełniała swoją rolę, bo to nie zweryfikuje danych z GET. Jeśli użytkownik spreparuje link i da np. 12rt6897 to konwersja do int zwróci 12.

Dobra uwaga, dzięki. Ale wtedy weryfikacja code z id prawdopodobnie nie powiodłaby się (WHERE id='" .$id. "' and code='" .$code. "'"), ale to tylko "prawdopodobnie". Najlepiej byłoby tu przekazać code i id w osobnych zmiennych i sprawdzać ich poprawność według zaplanowanego wzorca wyrażeniem regularnym, tak jak zaproponowałeś.
b4rt3kk
Cytat(Testosteron @ 6.10.2012, 13:48:40 ) *
Dzięki za pomoc, tylko nie rozumiem jednego. Jeżeli przesyłam dane z formularza to bezproblemowo mogę użyć funkcji is_int

Z drugiej jednak strony jeżeli funkcja utnie część kodu spreparowanego przez użytkownika to kod będzie niekompletny i na którymś etapie także zostanie zgłoszony błąd


Jak wiesz PHP automatycznie nadaje typ zmiennej.

  1. $variable = $_POST['jakas_nazwa']; // załóżmy ze w POST masz 123, takie przypisanie spowoduje, że zmienna będzie typu int
  2. echo gettype($variable);
  3. $variable = "$variable"; // a takie przypisanie spowoduje, że zmienna będzie traktowana już jako string
  4. echo gettype($variable);


Poza tym funkcja substr() jak można przeczytać w manualu operuje na stringach i zwracaną wartością jest również string.
bostaf
Cytat(b4rt3kk @ 6.10.2012, 14:19:50 ) *
  1. $variable = $_POST['jakas_nazwa']; // załóżmy ze w POST masz 123, takie przypisanie spowoduje, że zmienna będzie typu int

Mogę się mylić bo nie potrafię w manualu znaleźć tej informacji, ale zmienne POST i GET są zawsze stringami. Zatem takie przypisane zwróci również string(3) "123". Nawet jeśli wartość w formularzu będzie przypisana bez cudzysłowów, w taki sposób:
  1. <input type="hidden" name="jakas_nazwa" value=123>


Znalazłem jeszcze inny sposób na zwalidowanie integera, ale tylko od PHP5.2: użycie funkcji filter_var z rozszerzenia filter:
  1. $id = filter_var(substr($_GET['v'], 10), FILTER_VALIDATE_INT);
Tej funkcji już się nie da oszukać spreparowanym kodem, bo zwróci false.
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.