Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Filtrowanie danych
Forum PHP.pl > Forum > Przedszkole
ArekJ
Witam,

mam pytanie, czy dobrze zastosowałem filtrowanie danych w tym skrypcie(błędów nie wywala, ale nie wiem jak sprawdzić czy filtruje). A oto kod:

  1. <?php
  2. els:
  3.  
  4. dbConnect('xxx');
  5.        
  6. $login=htmlspecialchars($_POST['login']);
  7. $haslo=htmlspecialchars($_POST['haslo']);
  8. $email=htmlspecialchars($_POST['email']);
  9.  
  10.  
  11. $login=strip_tags($_POST['login']);
  12. $haslo=strip_tags($_POST['haslo']);
  13. $email=strip_tags($_POST['email']);
  14.  
  15.        
  16. if (!check_email($_POST['email']) || $_POST['login']=='' || $_POST['haslo']=='' || $_POST['email']=='') {
  17. error('Błąd podczas wypełniania formularzu! Popraw go i spróbuj ponownie. Możliwe błęd:    \n'.'-puste pole,\n'.'-błędny e-mail.');
  18. }
  19.  
  20.  
  21. $sql = 'SELECT COUNT(*) FROM uzytkownik WHERE login = "'.$_POST['login'].'"';
  22. $result = mysql_query($sql);
  23. if (!$result) {
  24. error('Błąd w zapytaniu SQL');
  25. }
  26. if (@mysql_result($result,0,0)>0) {
  27. error('Wybrany login jest zajęty. \n'.
  28. 'Proszę wpisać inny login. ');
  29. }
  30.  
  31. $sql = 'INSERT INTO uzytkownik SET
  32. login = "'.$_POST['login'].'",
  33. haslo = md5("'.$_POST['haslo'].'"),
  34. email = "'.$_POST['email'].'"';
  35. if (!mysql_query($sql)) error('Błąd w zapytaniu SQL');
  36.  
  37. echo('<HTML>
  38. <HEAD>
  39. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  40. <TITLE>Rejestracja zakończona</TITLE>
  41. <STYLE type=\"text/css\">
  42. <!--
  43. BODY, { font: 8pt; font-famil: Verdana, Arial; text-decoratio: none }
  44. -->
  45. </STYLE>
  46. </HEAD>
  47. <BODY>
  48. <P><B>Rejestracja zakończona pomyślnie!</B></P>
  49. <P>Logi: <B>'.$_POST['login'].'</B><BR>
  50. Hasło: <B>'.$_POST['haslo'].'</B></P>
  51. ');
  52.  
  53. endif
  54. ?>


I mam jeszcze pytanie o inne metody zabezpieczania i o wskazówki jak je zastosować smile.gif
b4x
Najprościej: mysql_real_escape_string" title="Zobacz w manualu PHP" target="_manual ;] czyli np.

  1. <?php
  2. mysql_query ('SELECT * FROM `users` WHERE `login` = "'.mysql_real_escape_string($logn).'"');
  3. ?>


htmlspecialchars + strip_tags - nie zabezpieczy Cię przed SQL Inject winksmiley.jpg bo spróbuj np. do zapytania zarzucić: '
- dlatego polecam mysql_real_escape_string" title="Zobacz w manualu PHP" target="_manual tongue.gif


Po 2 gie, jak definiujesz zmienne np:

  1. <?php
  2. $login=htmlspecialchars($_POST['login']); // o to mi chodzi.
  3. $sql = 'SELECT COUNT(*) FROM uzytkownik WHERE login = "'.$_POST['login'].'"';
  4. ?>


To spójrz - dane nieprzefiltrowane się dostaną, bo tylko zmienna $login jest filtrowana. A Ty w zapytaniu do mysql odnosisz się do danych przesłanych w formularzu.

Poprawnie powinno wyglądać:

  1. <?php
  2. $sql = 'SELECT COUNT(*) FROM uzytkownik WHERE login = "'.mysql_real_escape_string($login).'"'; //&nbsp:P
  3. ?>
ArekJ
A czemu tutaj:

  1. <?php
  2. $sql = 'SELECT COUNT(*) FROM uzytkownik WHERE login = "'.mysql_real_escape_string($login).'"'; //&nbsp:P
  3. ?>


jest filtrowana całość? Przecieź w skrypcie występuje tylko zmienna $login?

I po drugie rozumiem, źe mam usunąć:

  1. <?php
  2. $login=htmlspecialchars($_POST['login']);
  3. $haslo=htmlspecialchars($_POST['haslo']);
  4. $email=htmlspecialchars($_POST['email']);
  5.  
  6.  
  7. $login=strip_tags($_POST['login']);
  8. $haslo=strip_tags($_POST['haslo']);
  9. $email=strip_tags($_POST['email']);
  10. ?>


bo to nie zapewnia mi bezpieczeństwa?
b4x
Ja bym to tak zrobił

  1. <?php
  2.  
  3.    $login = htmlspecialchars(strip_tags($_POST['login']));
  4.    $haslo = md5($_POST['haslo']);
  5.    $email = htmlspecialchars(strip_tags($_POST['email']));
  6.  
  7.    if (!check_email($_POST['email']) || $_POST['login']=='' || $_POST['haslo']=='' || $_POST['email']=='') {
  8.  
  9.        error('Błąd podczas wypełniania formularzu! Popraw go i spróbuj ponownie. Możliwe bł&#281:    \n'.'-puste pole,\n'.'-błędny e-mail.');
  10.  
  11.    }
  12.  
  13.  
  14.    $sql = 'SELECT COUNT(*) FROM uzytkownik WHERE login = "'.mysql_real_escape_string($login).'"';
  15.  
  16.    $result = mysql_query($sql);
  17.  
  18.        if (!$result) {
  19.  
  20.            error('Błąd w zapytaniu SQL');
  21.  
  22.        }
  23.    
  24.        if (@mysql_result($result,0,0)>0) {
  25.            error('Wybrany login jest zajęty. \n'.
  26.            'Proszę wpisać inny login. ');
  27.        }
  28.  
  29.  
  30.        $sql = 'INSERT INTO uzytkownik SET login = "'.mysql_real_escape($login).'", haslo = "'.$haslo.'", email = "'.mysql_real_escape_string($email).'"';
  31.  
  32.            if (!mysql_query($sql)) error('Błąd w zapytaniu SQL');
  33.    
  34.            echo('<HTML>
  35.                <HEAD>
  36.                <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  37.                <TITLE>Rejestracja zakończona</TITLE>
  38.                <STYLE type=\"text/css\">
  39.                <!--
  40.                BODY, { fo: 8pt; font-famil: Verdana, Arial; text-decoratio: none }
  41.                -->
  42.                </STYLE>
  43.                </HEAD>
  44.                <BODY>
  45.                <P><B>Rejestracja zakończona pomyślnie!</B></P>
  46.                <P>Lo: <B>'.$login.'</B><BR>
  47.                Hasło: <B>'.$haslo.'</B></P>
  48.            ');
  49.  
  50. ?>


;]
ArekJ
Dobra winksmiley.jpg jak wrócę do domu to sprawdze czy działa, ale mam nadzieję, źe tak. I jeszcze pytanie o inne formy zabezpieczania? I czy jak będę robił skrypt logoania to teź muszę zabezpieczać w ten sposób:

  1. <?php
  2. $login = htmlspecialchars(strip_tags($_POST['login']));
  3. ?>
b4x
"I jeszcze pytanie o inne formy zabezpieczania?" - to z zupełnością powinno wystarczyć smile.gif

Możesz np. napisać sobie funkcję która ułatwi Ci życie winksmiley.jpg

  1. <?php
  2. function filtruj($string) {
  3.  
  4. return htmlspecialchars(strip_tags($string));
  5.  
  6. }
  7. ?>


Wtedy np. wystarczyłoby :
  1. <?php
  2. $login = filtruj($_POST['login']);
  3. ?>
ArekJ
I to samo muszę zastosować do maila?
b4x
Jeśli chcesz, to możesz. Ale widzę że do maila masz jakąś funkcję odpowiedzialną za jego sprawdzanie. (Czy jest poprawny.)

Czyli zapewne ta funkcja nie przyjmuje znaków specjalnych typu ^'% itd. winksmiley.jpg

Więc wtedy maila nie musisz. winksmiley.jpg


http://webmade.org/porady/bezpieczenstwo-p...on-xss-csrf.php


Poczytaj, może to Ci bardziej wszystko naświetli winksmiley.jpg
ArekJ
A hasło też mam filtrować?

P.S. A z tej strony co podałeś to się dowiedziałem jakie funkcje odpowiadają za filtrowanie biggrin.gif

EDIT:

Nie działa :/ Gdy daje
  1. <?php
  2. $login = htmlspecialchars(strip_tags($_POST['login']));
  3.   $haslo = md5($_POST['haslo']);
  4.   $email = htmlspecialchars(strip_tags($_POST['email']));
  5.  
  6.   if (!check_email($_POST['email']) || $_POST['login']=='' || $_POST['haslo']=='' || $_POST['email']=='') {
  7.  
  8.       error('Błąd podczas wypełniania formularzu! Popraw go i spróbuj ponownie. Możliwe bł&#28:    \n'.'-puste pole,\n'.'-błędny e-mail.');
  9.  
  10.   }
  11.  
  12.  
  13.   $sql = 'SELECT COUNT(*) FROM uzytkownik WHERE login = "'.mysql_real_escape_string($login).'"';
  14.  
  15.   $result = mysql_query($sql);
  16.  
  17.       if (!$result) {
  18.  
  19.           error('Błąd w zapytaniu SQL');
  20.  
  21.       }
  22.  
  23.       if (@mysql_result($result,0,0)>0) {
  24.           error('Wybrany login jest zajęty. \n'.
  25.           'Proszę wpisać inny login. ');
  26.       }
  27.  
  28.  
  29.       $sql = 'INSERT INTO uzytkownik SET login = "'.mysql_real_escape($login).'", haslo = "'.$haslo.'", email = "'.mysql_real_escape_string($email).'"';
  30.  
  31.           if (!mysql_query($sql)) error('Błąd w zapytaniu SQL');
  32.  
  33.           echo('<HTML>
  34.               <HEAD>
  35.               <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  36.               <TITLE>Rejestracja zakończona</TITLE>
  37.               <STYLE type=\"text/css\">
  38.               <!--
  39.               BODY, { fo: 8pt; font-famil: Verdana, Arial; text-decoratio: none }
  40.               -->
  41.               </STYLE>
  42.               </HEAD>
  43.               <BODY>
  44.               <P><B>Rejestracja zakończona pomyślnie!</B></P>
  45.               <P>Lo: <B>'.$login.'</B><BR>
  46.               Hasło: <B>'.$haslo.'</B></P>
  47.           ');
  48. ?>


To wywala:

Kod
Fatal error: Call to undefined function mysql_real_escape() in /home/accounts_a/arekj/public_html/rejestracja.php on line 94


Jakieś pomysły?
morwo
Przydałby się jeszcze kurs czytania angielskiego ze zrozumieniem winksmiley.jpg
Cytat(ArekJ @ 17.09.2008, 21:09:50 ) *
Kod
Fatal error: Call to undefined function mysql_real_escape() in /home/accounts_a/arekj/public_html/rejestracja.php on line 94

Pozwolicie, że przetłumacze "po swojemu", bo angielski mój nie najlepszy winksmiley.jpg
Cytat
Kod
Błąd krytyczny: Wywołano niezdefiniowaną funkcje mysql_real_escape() w /home/accounts_a/arekj/public_html/rejestracja.php w linii 94


Czaisz? Jesli sam nie napisałeś, to funkcja mysql_real_escape() nie istnieje. Koledzy wyżej pisali o funkcji mysql_real_escape_string()" title="Zobacz w manualu PHP" target="_manual, którą kilka razy zastosowałeś w wyżej wymienionym skrypcie.

Poza tym przeważnie używam htmlentities()" title="Zobacz w manualu PHP" target="_manual z odpowiednimi parametrami i z tego, co się orientuje równie dobrze mnie zabezpieczy przed SQLInjection, jak mysql_real_escape_string()" title="Zobacz w manualu PHP" target="_manual smile.gif
ArekJ
Dzięki, na tym poziomie to znam angielski, ale nie zauważyłem, że funkcja powinna się inaczej nazywać biggrin.gif Proszę o zamknięcie tematu winksmiley.jpg
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.