Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Filtrowanie danych, Czy dobrze użyte?
ArekJ
post 17.09.2008, 15:08:55
Post #1





Grupa: Zarejestrowani
Postów: 266
Pomógł: 9
Dołączył: 21.05.2008
Skąd: Łomianki

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


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


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

"Do bramy, bo pada deszcz
Gdy zaćpiesz przejdzie dreszcz
I wróci, wróci tęcza barw
I pęknie twój wrogi świat" R. Riedel
Go to the top of the page
+Quote Post
b4x
post 17.09.2008, 15:31:10
Post #2





Grupa: Zarejestrowani
Postów: 658
Pomógł: 95
Dołączył: 20.12.2005
Skąd: N54,35° E18,63° (Gdańsk)

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


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. ?>


Ten post edytował b4x 17.09.2008, 15:33:44


--------------------
Go to the top of the page
+Quote Post
ArekJ
post 17.09.2008, 15:46:56
Post #3





Grupa: Zarejestrowani
Postów: 266
Pomógł: 9
Dołączył: 21.05.2008
Skąd: Łomianki

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


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?


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

"Do bramy, bo pada deszcz
Gdy zaćpiesz przejdzie dreszcz
I wróci, wróci tęcza barw
I pęknie twój wrogi świat" R. Riedel
Go to the top of the page
+Quote Post
b4x
post 17.09.2008, 15:53:00
Post #4





Grupa: Zarejestrowani
Postów: 658
Pomógł: 95
Dołączył: 20.12.2005
Skąd: N54,35° E18,63° (Gdańsk)

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


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. ?>


;]

Ten post edytował b4x 17.09.2008, 15:55:36


--------------------
Go to the top of the page
+Quote Post
ArekJ
post 17.09.2008, 15:57:46
Post #5





Grupa: Zarejestrowani
Postów: 266
Pomógł: 9
Dołączył: 21.05.2008
Skąd: Łomianki

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


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. ?>


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

"Do bramy, bo pada deszcz
Gdy zaćpiesz przejdzie dreszcz
I wróci, wróci tęcza barw
I pęknie twój wrogi świat" R. Riedel
Go to the top of the page
+Quote Post
b4x
post 17.09.2008, 16:01:44
Post #6





Grupa: Zarejestrowani
Postów: 658
Pomógł: 95
Dołączył: 20.12.2005
Skąd: N54,35° E18,63° (Gdańsk)

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


"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. ?>


Ten post edytował b4x 17.09.2008, 16:02:12


--------------------
Go to the top of the page
+Quote Post
ArekJ
post 17.09.2008, 16:02:40
Post #7





Grupa: Zarejestrowani
Postów: 266
Pomógł: 9
Dołączył: 21.05.2008
Skąd: Łomianki

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


I to samo muszę zastosować do maila?


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

"Do bramy, bo pada deszcz
Gdy zaćpiesz przejdzie dreszcz
I wróci, wróci tęcza barw
I pęknie twój wrogi świat" R. Riedel
Go to the top of the page
+Quote Post
b4x
post 17.09.2008, 16:05:20
Post #8





Grupa: Zarejestrowani
Postów: 658
Pomógł: 95
Dołączył: 20.12.2005
Skąd: N54,35° E18,63° (Gdańsk)

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


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


--------------------
Go to the top of the page
+Quote Post
ArekJ
post 17.09.2008, 20:09:50
Post #9





Grupa: Zarejestrowani
Postów: 266
Pomógł: 9
Dołączył: 21.05.2008
Skąd: Łomianki

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


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?

Ten post edytował ArekJ 17.09.2008, 20:48:09


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

"Do bramy, bo pada deszcz
Gdy zaćpiesz przejdzie dreszcz
I wróci, wróci tęcza barw
I pęknie twój wrogi świat" R. Riedel
Go to the top of the page
+Quote Post
morwo
post 18.09.2008, 13:51:39
Post #10





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 31.05.2006

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


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

Ten post edytował morwo 18.09.2008, 13:52:22
Go to the top of the page
+Quote Post
ArekJ
post 18.09.2008, 19:00:47
Post #11





Grupa: Zarejestrowani
Postów: 266
Pomógł: 9
Dołączył: 21.05.2008
Skąd: Łomianki

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


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


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

"Do bramy, bo pada deszcz
Gdy zaćpiesz przejdzie dreszcz
I wróci, wróci tęcza barw
I pęknie twój wrogi świat" R. Riedel
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 Wersja Lo-Fi Aktualny czas: 19.07.2025 - 14:48