Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] SQL Injection
Forum PHP.pl > Forum > PHP
pablo114
Napisałem skrypt ale nie potrafie go zabezpieczyć. Jest to skrypt rejestracji wprowadzający login i hasło do bazy MSSQL

czy funkcja addslashes wystarczy? jeśli możecie to pomóżcie smile.gif

  1. <?
  2. #-- Fragment gdzie podajemy dane do połączenia z MSSQL'em --#
  3. $host = "localhost";
  4. $user = "login_sql";
  5. $userpass = "haslo_sql";
  6. $baza = "nazwa_bazy";
  7.  
  8. #-- Łączenie się z MSSQL'em i wybór bazy danych --#
  9. $polaczenie = @mssql_connect($host,$user,$userpass);
  10. @mssql_select_db($baza,$polaczenie);
  11.  
  12. #-- Tu tworzymy zmienne, pobierające dane z formularza --#
  13. $login = $_POST['login'];
  14. $haslo = $_POST['haslo'];
  15. $potwierdzenie = $_POST['haslo2'];
  16.  
  17. #-- Sprawdzamy czy hasła w polach formularza są identyczne, jeśli nie, skrypt kończ
    y swoje działanie --#
  18. if ($haslo != $potwierdzenie) // Znak != oznacza różny
  19. {
  20. die ('Hasła się nie zgadzają, spróbuj ponownie<br><a href="reg.php">wróc</a>');
  21. }
  22.  
  23. #-- Zmienna do której przypisane jest zadanie SELECT --#
  24. $sprawdzlogin = mssql_query("SELECT LOWER(memb___id) FROM MEMB_INFO WHERE LOWER(memb___id) = ('$login')") or die;
  25.  
  26. #-- Warunek sprawdzający czy w bazie nie ma już identycznego loginu, jeśli jest, sk
    rypt kończy swoje działanie i wyświetla odpowiedni komunikat --#
  27. if (mssql_num_rows($sprawdzlogin)) 
  28. {
  29. die ('Takie konto juz istnieje, wybierz inna nazwe<br><a href="reg.php">wróc</a>');
  30.  }
  31. #-- kolejny warunek, sprawdza pola w formularzu czy są wypełnione, jeśli nie wyświe
    tla odpowiednią wiadomość --#
  32. elseif (empty($login) || empty($haslo) ) // Znak || oznacza słowo LUB
  33. {
  34. die ('Wypełnij wszystkie pola<br><a href="reg.php">wróc</a>');
  35. }
  36.  
  37. #-- I teraz, po przejściu wszystkich warunków, skrypt wrzuca dane do bazy danych, j
    eśli się nie powiedzie wyświetla odpowiedni komunikat --#
  38. mssql_query("INSERT INTO MEMB_INFO 
  39.  
  40. (memb_guid,memb___id,memb__pwd,memb_name,sno__numb,post_code,addr_info,addr_
    d
  41.  
  42. eta,tel__numb,mail_addr,phon_numb,fpas_ques,fpas_answ,job__code,appl_days,mod
  43.  
  44. i_days,out__days,true_days,mail_chek,bloc_code,ctl1_code) VALUES 
  45.  
  46. ('1','$login','$haslo','Imie', 
  47.  
  48. '1','1234','11111','personalid','12343','email','email','pytanie','odpowiedz'
  49.  
  50. ,'1',getdate(),getdate(),getdate(),getdate(),'1','0','1')") || die('Niestety, zakładanie konta nie powiodło się, spróbuj ponownie<br><a href="reg.php">wróc</a>');
  51.  
  52. #-- Po prawidłowym zakończeniu wpisywania danych do bazy, komunikat --#
  53. echo "Konto zostało utworzone, dziękujemy"; //echo służy do wyświetlania tekstu
  54.  
  55. ?>
misiek172
powinieneś jeszcze użyć funkcji usuwającej wszelkie TAGi HTML, JS itp.

http://pl2.php.net/manual/pl/function.strip-tags.php
Kicok
Cytat
Napisałem skrypt ale nie potrafie go zabezpieczyć. Jest to skrypt rejestracji wprowadzający login i hasło do bazy MSSQL

czy funkcja addslashes wystarczy?


w MSSQL stosuje się inny znak ucieczki. Zamiast addslashes, mysql_escape_string czy mysql_real_escape_string należy napisać sobie swoją własną funkcję:
  1. <?php
  2.  
  3. function secure( $string )
  4. {
  5. return str_replace( "'", "''", $string );
  6. }
  7.  
  8. ?>


i używać jej zamiast addslashes()
pablo114
Cytat
w MSSQL stosuje się inny znak ucieczki. Zamiast addslashes, mysql_escape_string czy mysql_real_escape_string należy napisać sobie swoją własną funkcję:


Sorka za głupie pytanie ale po prostu nie mam pojęcia o tego typu zabezpieczeniach.
Te funkcje, którą podał kicok wstawić na początku pliku czy może wpisać ją w któryś z wierszy zeby zabezpieczyć konkretny fragment pliku?
Kicok
Temat: SQL Injection Insertion albo http://www.google.pl/search?hl=pl&q=sql+injection


Żeby się porządnie zabezpieczyć przed SQL Injection musisz mieć jakieś pojęcie o PHP i SQL. Po pierwsze zapamiętaj, że po stronie PHP układanie jest tylko zapytanie (napis), które wysyłane jest to serwera baz danych. Złośliwy użytkownik może w formularzu podać takie dane, które zmienią działanie zapytania, i przed tym trzeba się zabezpieczać. Przykład:

  1. <?php
  2.  
  3. $login = $_POST['login'];
  4. $haslo = $_POST['haslo'];
  5.  
  6. $zapytanie = "SELECT * FROM uzytkownicy WHERE ( login = '" . $login . "') AND ( haslo = '" . $haslo . "' )";
  7. $result = mssql_query( $zapytanie );
  8.  
  9. ?>


Jeśli użytkownik poda w formularzu:
login: admin
hasło: iskierka
To zapytanie będzie wyglądało tak:
SELECT * FROM uzytkownicy WHERE ( login = 'admin' ) AND ( haslo = 'iskierka' )

Jeśli urzytkownik poda w formularzu:
login: admin' ) --
hasło: cokolwiek
To zapytanie będzie wyglądało tak:
SELECT * FROM uzytkownicy WHERE ( login = 'admin' ) -- ') AND ( haslo = 'cokolwiek' )

Wszystko co znajduje się po "--" jest traktowane jako komentarz, serwer baz danych tego nie widzi. Czyli lekko preparując wysyłane dane możemy pobrać informacje o adminie nie znając jego hasła.
Żeby MSSQL rozpoznał apostrof jako "apostrof", a nie jako koniec napisu, stosuje się tzw. znaki ucieczki. Dla MSSQL jest to drugi apostrof. Więc jeśli zmienne $login i $haslo przepuścisz przez funkcję, którą podałem wyżej, to nie uda się wykonać ataku SQL Injection:
  1. <?php
  2.  
  3. function secure( $string )
  4. {
  5. return str_replace( "'", "''", $string );
  6. }
  7.  
  8.  
  9. $login = $_POST['login'];
  10. $haslo = $_POST['haslo'];
  11.  
  12. $login = secure( $login );
  13. haslo = secure( $haslo );
  14.  
  15.  
  16. $zapytanie = "SELECT * FROM uzytkownicy WHERE ( login = '" . $login . "') AND ( haslo = '" . $haslo . " )";
  17. $result = mssql_query( $zapytanie );
  18.  
  19. ?>


Po zastosowaniu funkcji secure() zapytanie będzie miało postać:
SELECT * FROM uzytkownicy WHERE ( login = 'admin'') -- ' ) AND ( haslo = 'cokolwiek' )
i nie zwróci ono nic, bo w bazie danych najprawdopodobniej nie będzie nikogo z loginem: "admin') -- " ;]


Trochę inaczej należy patrzeć na zabezpieczenie danych, które nie są umieszczane w apostrofach, np:
  1. <?php
  2.  
  3. $id = $_GET['id'];
  4.  
  5. $zapytanie = 'SELECT * FROM tabela WHERE id = ' . $id;
  6. $result = mssql_query( $zapytanie );
  7.  
  8. ?>

W takim przypadku trzeba stosować intval" title="Zobacz w manualu PHP" target="_manual, ctype_digit" title="Zobacz w manualu PHP" target="_manual czy inne techniki, o których mi się nie chce pisać, a które znajdziesz pod linkami które podałem powyżej.
pablo114
Cytat
Czyli lekko preparując wysyłane dane możemy pobrać informacje o adminie nie znając jego hasła.

pod warunkiem, ze jest w bazie ktoś z loginem admin winksmiley.jpg jak nie znasz loginu admina to szukaj wiatru w polu tongue.gif ale mniejsza o to

Dziękuje za pomoc smile.gif
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.