Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

22 Stron V   1 2 3 > »   
Reply to this topicStart new topic
> SQL Injection/Insertion, Jak zapobiec włamaniu na stronę.
Najki
post
Post #1





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 12.02.2004
Skąd: Poznań

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


Pytania o streszczenie wątku, posty z "genialnymi" skryptami nadającymi się tylko na przedszkole i inne tego typu, będą bez ostrzeżenia usuwane przez moderatorów.
To mówiłem ja, Jarząbek... znaczy nospor dnia 2007-12-10
-------------------------------------------------------------------------------


SQL Injection (zwane też "SQL Insertion") to (rzekomo) najprostszy sposób włamu na stronę. Spowodowany jest on niepełnym sformułowaniem zapytań do MySQL.

Przykład. Dajemy na stronie możliwość edycji profilu. Zapytanie do SQL wygląda następująco:
  1. <?php
  2. $query = &#092;"update uzytkownicy set pole='$dane' where id='$id'\";
  3. ?>

Osoba włamująca się na stronę umieszcza całkiem prosty, odpowiedni ciąg znaków/poleceń w dowolnym polu edycji tego profilu, który wygląda np. tak (dla zmiany hasła użytkownika o dowolnie wybranym, przez atakującego numerze ID):
  1. <?php
  2. ', haslo='nowe_haslo' WHERE id = '1
  3. ?>


W taki oto prosty sposób, osoba atakująca zmieniła hasło użytkownikowi o ID=1 (zazwyczaj administrator). W podobny sposób można również wyciągnąć dowolne dane z tabeli SQL.

W każdym razie. Poszperałem, pomyślałem i zebrałem wszystko do kupy. Zamieszczam to tutaj razem, oraz proszę o rozbudowanie tego topica, gdyż nie znalazłem na tym forum więcej informacji o "SQL Injection".

Oto co możemy dokonać:
1. Możemy sformułować nasze zapytanie do SQL tak:
  1. <?php
  2. $query = 'update `uzytkownicy` set `pole`=\"'.$dane.'\" where `id`=\"'.$id.'\";';
  3. ?>

2. Przy wstawianiu numerów ID do zapytań należy stosować tzw. rzutowanie typów:
  1. <?php
  2. $id = (int)$_GET['id'];
  3. // lub
  4. $id = intval($_GET['id']);
  5. ?>

3. Przy wstawianiu tekstów, należy wyciąć niebezpieczne znaki przy pomocy funkcji:
  1. <?php
  2. $string = mysql_real_escape_string($_POST['string']); // PHP5
  3.  
  4. $string = mysql_escape_string($_POST['string']); /* lub */ $string = addslashes($_POST['string']); // PHP4
  5. ?>


Może nie ma tego dużo, ale jest to już jakaś podstawa do zabezpieczenia strony/skryptu przed prostym i niezwykle niebezpiecznym, SQL Injection. Proszę osoby obeznane w tym temacie, aby dopisały tu własne propozycje metod zabezpieczenia się przed tym atakiem.

Ten post edytował Najki 14.02.2008, 10:04:12
Go to the top of the page
+Quote Post
Vengeance
post
Post #2





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


Cytat(Najki @ 2004-11-25 00:13:57)
Oto co możemy dokonać:
1. Możemy sformułować nasze zapytanie do SQL tak:
  1. <?php
  2. $query = 'update `uzytkownicy` set `pole`=\"'.$dane.'\" where `id`=\"'.$id.'\";';
  3. ?>

2. Numer ID warto ustawiać w sposób $_GET['id'], lub $_POST['id'], można też ustawić go w nast. sposób:
  1. <?php
  2. $id = (int)$_GET['id'];
  3. ?>


Może nie ma tego dużo, ale jest to już jakaś podstawa do zabezpieczenia strony/skryptu przed prostym i niezwykle niebezpiecznym, SQL Injection. Proszę osoby obeznane w tym temacie, aby dopisały tu własne propozycje metod zabezpieczenia się przed tym atakiem.

punkt 1. twojego "zabezpieczenia" nie ma nic do rzeczy z rzeczywistym bezpieczeństwem przynajmniej wg mnie

punkt 2. ja stosuje po prostu addslashes() i filtruje dane z POST GET COOKIE itd. tzn jak ma byc liczba do liczba a nie string (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

stosujac gotowe skrypty ala phpbb itd. dopisuje zawsze w jakims glownym pliku
usuwanie s url-a wystapien wyrazow "<script>" i "UNION" co zabezpiecza przez script kiddie
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Z tego co wiem to mysql nie wykonuje zapytan typu "zapyta1;zapyt2" od sstrony php wiec tego nei masz sie co bac... co do filtrowania danych...

mysql_escape_string" title="Zobacz w manualu PHP" target="_manual
Go to the top of the page
+Quote Post
Najki
post
Post #4





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 12.02.2004
Skąd: Poznań

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


Cytat(Vengeance @ 2004-11-25 00:34:40)
punkt 1. twojego "zabezpieczenia" nie ma nic do rzeczy z rzeczywistym bezpieczeństwem przynajmniej wg mnie

Gdzieś znalazłem informację, że niby jednak to ma pomóc (głównie chodzi o średnik tam też o średnik na końcu zapytania)
Cytat(Vengeance @ 2004-11-25 00:34:40)
punkt 2. ja stosuje po prostu addslashes() i filtruje dane z POST GET COOKIE itd. tzn jak ma byc liczba do liczba a nie string

Czy czasem $_POST, $_GET i $_COOKIE nie mają automatycznie dodawanych slash'y ?
Cytat(Vengeance @ 2004-11-25 00:34:40)
stosujac gotowe skrypty ala phpbb itd. dopisuje zawsze w jakims glownym pliku
usuwanie s url-a wystapien wyrazow "<script>" i "UNION" co zabezpiecza przez script kiddie

Tak będzie OK? (nie znam się na wyrażeniach regularnych, a chciałbym, aby w tym topicu wszystko było jasno opisane, co by nikt problemów nie miał)
  1. <?php
  2. preg_replace( '%<script>%', '', $zmienna );
  3. ?>
Go to the top of the page
+Quote Post
Kinool
post
Post #5





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

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


zabezpieczenie w stylu:
  1. <?php
  2. $query = 'update `uzytkownicy` set `pole`=\"'.$dane.'\" where `id`=\"'.$id.'\";';
  3. ?>
to jak juz powiedziano zadne zabezpieczenie a pozatym zmnijsza wydajnosc zapytania, umieszczanie wartosci liczbowych w momiedzy " " powiduje iz MySQL mysli ze ma do czynienia ze znakami (stringami) i niepotzrebnie musi konwertowac typy.

Przylacze sie do tego co juz powiedziano, uzywac Zmiennych globalnych, i filtrowac wszystko, to co ma byc liczba to konwertowac na liczbe np:
  1. <?php
  2. $_GET['id'] = intval($_GET['id']);
  3. ?>
a to co ma byc stringiem dodawac slashe (addslashes).

Podstawowa zasada to nie ufac nikomu i spodziewac sie najgorszego!
budowac aplikacje tak by wytrzymaly wybuch nuklearny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

w jednym ze swoich projektw zrobilem petle na foreach ktora z kazdego elemenu tablicy ($_GET, $_POST, $_COOKIE) zamieniala ewentualn wystapienia wyrazen takich jak "SELECT, UPDATE, INSERT, DELETE, WHERE AND" dodajac do nich np twarda spacje &nbsp; lub jakis inny znak co powodowalo ze ew. zapytanie bylo by z gory obarczone bledem.

coprawda rozwiazanie takie nie jest eleganckie bo wszystkie wystapienia tych wyrazeni byly zamieniane nawet jesli ktos nie mial zlych intencji ale sa one bardzo zadko uzywane w naszym slownictwie a dodanie np. twardej spacji praktycznie niczego nie zmienia w wygladzie takiego komentarza, posta etc.
Go to the top of the page
+Quote Post
johnson
post
Post #6





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 3.12.2004

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


Cytat(Kinool @ 2004-11-25 07:48:38)
to co ma byc stringiem dodawac slashe (addslashes)

nie rozumiem dlaczego wszyscy piszą o addslashes, przecież php automatycznie dodaje slashe do wszystkich zmiennych $_GET i $_POST i włamanie opisane przez Najki
  1. <?php
  2. ', haslo='nowe_haslo' WHERE id = '1

nie ma prawa zadziałać.

Czy mógłby ktoś wyjaśnić mi tą sytuację?
Go to the top of the page
+Quote Post
Najki
post
Post #7





Grupa: Zarejestrowani
Postów: 190
Pomógł: 0
Dołączył: 12.02.2004
Skąd: Poznań

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


Owszem dodaje, ale chyba tylko, gdy na serwerze jest włączone magic_quotes_gpc ?
A jeśli nie to jakim prawem kolega mi się włamał? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
Seth
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


Dodam jeszcze te dwa linki:
http://www.nextgenss.com/papers/SecondOrderCodeInjection.pdf
http://hacking.pl/download.php?file=get&id=113
Go to the top of the page
+Quote Post
morrison
post
Post #9





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 24.05.2004
Skąd: krakow

Ostrzeżenie: (10%)
X----


Temat ciekawy, ale w zasadzie nie wiem jeszcze co moglbym zrobic w swojej aplikacji aby uniemozliwic taki atak i aby bylo to zrobione w profesjonalny sposob. Gdyby ktos mogl zerknac na kod i pomoc mi.
Oto kod ktory sluzy do sprawdzenia hasla i nazwy usera:
  1. <?php
  2.  
  3. // utworzenie krotkich nazw zmiennych i spr. czy dane sa przek. w zm. sesji
  4. if (!isset($_SESSION['nazwa_uz']))
  5. $_SESSION['nazwa_uz'] = $HTTP_POST_VARS['nazwa_uz'];
  6. if (!isset($_SESSION['haslo']))
  7. $_SESSION['haslo'] = $HTTP_POST_VARS['haslo'];
  8.  
  9. //spr. czy zostalo nadane nowe haslo
  10. if (isset($_SESSION['nowe_haslo']))
  11. $_SESSION['haslo'] = $_SESSION['nowe_haslo'];
  12.  
  13. if (($_SESSION['nazwa_uz'] && $_SESSION['haslo']) || ($_SESSION['nazwa_uz'] == '' || $_SESSION['haslo'] == ''))
  14. // proba logowania, sprawdzenie czy podano login oraz haslo
  15. {
  16. if (loguj($_SESSION['nazwa_uz'], $_SESSION['haslo']))
  17. {
  18. // jesli uzytkownik znajduje sie w bazie danych rejestracja identyfikatora
  19. $HTTP_SESSION_VARS['prawid_uzyt'] = $_SESSION['nazwa_uz'];
  20.  
  21.  
  22. }
  23. else
  24.  
  25. ?>


a to kod funkcji wykonujacej to sprawdzenie:
  1. <?php
  2.  
  3. function loguj($nazwa_uz, $haslo)
  4. // sprawdzenie nazwy uzytkownika i hasla w bazie danych
  5. // jezeli sie �zgadza, zwraca true
  6. // jezeli nie, zwraca false
  7. {
  8. // polaczenie z baza danych
  9. $lacz = lacz_bd();
  10. if (!$lacz)
  11. return false;
  12.  
  13. // sprawdzenie unikatowosci nazwy uzytkownika
  14. $wynik = mysql_query(&#092;"select * from uzytkownik 
  15.  where nazwa_uz='$nazwa_uz'
  16.  and haslo = password('$haslo')&#092;");
  17. if (!$wynik)
  18.  return false;
  19.  
  20. if (mysql_num_rows($wynik) > 0)
  21.  return true;
  22. else 
  23.  return false;
  24. }
  25.  
  26. ?>

Chcialbym uniknac mozliwosci wlamania, poprzez wpisanie kodu SQL do pola haslo i uzytkownik:)
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


przyklad:
  1. <?php
  2.  
  3. $sql = mysql_query(&#092;"SELECT * FROM news WHERE id=\".$_GET['id']);
  4.  
  5. ?>


wywołanie normalne:
Kod
news.php?id=1
news.php?id=25
itd


wywołanie zmodyfikowane przez kogostam
np.
Kod
news.php?id=1;DROP%20TABLE%20news;


zabezpieczenie? ja znalazlem pare...

1. dodanie id2

  1. <?php
  2.  
  3. if(md5($_GET['id']*4)!=$_GET['id2'])die('Błędny url');
  4.  
  5. ?>


2. wymuszenie typu

  1. <?php
  2.  
  3. $id = (int)$_GET['id'];
  4.  
  5. ?>


3. mysql_escape_string

  1. <?php
  2.  
  3. $id = mysql_escape_string($_GET['id']);
  4.  
  5. ?>


ale mam wrazenie ze to dalej nie o to biega... z tych 3 które przedstawilem to pierwsze wydaje mi sie być najrozsądniejsze...
Go to the top of the page
+Quote Post
sobstel
post
Post #11





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


Cytat(ActivePlayer @ 2005-02-26 21:45:06)
ale mam wrazenie ze to dalej nie o to biega... z tych 3 które przedstawilem to pierwsze wydaje mi sie być najrozsądniejsze...

osobiscie uwazam ze dosc dobrym rozwiazaniem jest odpowiednie zarządzanie uprawnieniami, np. stworzyc konto dla www, gdzie moga byc tylko SELECT, INSERT, UPDATE, ewentualnei DELETE

druga sprawa, czy probowales w praktyce wykonac przedstawione przez ciebie polecenie? standardowo (nie jestem pewny czy da sie to przestawic tak zeby bylo inaczej) przez mysql_querynie wykonasz dwóch zapytań
Go to the top of the page
+Quote Post
Vengeance
post
Post #12





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


przez mysql_query() nie. ale funckje postgreSQL już to dopuszczają :/
Dlatego userzy tego drugiego mają większy problem.

Co do zabezpieczenia, nie wiem czym się tak przejmujecie? ;]
Ja stosuje jedynie addslashes() oraz usuwam slowo 'UNION' ze zmiennych
Go to the top of the page
+Quote Post
Riklaunim
post
Post #13





Grupa: Zarejestrowani
Postów: 640
Pomógł: 44
Dołączył: 8.02.2004

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


dość często jest WHERE coś = liczba gdzie coś jest polem auto_increment i ma wartości liczbowe.. wystarczy przed wykonaniem zapytania sprawdzić czy is_numeric parametr dla Where
Go to the top of the page
+Quote Post
MoD
post
Post #14





Grupa: Zarejestrowani
Postów: 193
Pomógł: 0
Dołączył: 14.09.2003
Skąd: Brodnica (koło Torunia)

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


Ja do liczb stosuje najczęściej ereg" title="Zobacz w manualu PHP" target="_manual (zwłaszcza w UPDATE, w grze MMORPG). Wtedy mam pewność że osoba która wpisze np -1230 nie wyrządzi mi żadnych szkód. A zabezpieczanie skryptów można trenować na wspomnianym przeze mnie wyżej ExoFusion. Jak ktoś go tak zabezpieczy, że nie będzie żadnych (no, może nie żadnych, a prawie żadnych) błędów to będzie się miał czym pochwalić (ja znałem 2 gry na 10 które były w miarę zabezpieczone, ale i tak padły - właśnie przez SQL Injection)
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #15





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


Cytat
Ja do liczb stosuje najczęściej ereg (zwłaszcza w UPDATE, w grze MMORPG). Wtedy mam pewność że osoba która wpisze np -1230 nie wyrządzi mi żadnych szkód. A zabezpieczanie skryptów można trenować na wspomnianym przeze mnie wyżej ExoFusion. Jak ktoś go tak zabezpieczy, że nie będzie żadnych (no, może nie żadnych, a prawie żadnych) błędów to będzie się miał czym pochwalić (ja znałem 2 gry na 10 które były w miarę zabezpieczone, ale i tak padły - właśnie przez SQL Injection)


Hmmm.... wykonanie ereg zajmuje nieco czasu (jak to wyrażeń regularnych). Chyba jednak lepiej się nieco przyłożyć i pobawić kombinacją is_numeric(), is_integer(), intval() i warunkami. Chyba każdy wie jakiego mniej więcej zakresu się spodziewa? Jak nie chcesz liczb ujemnych to po porostu wycinasz je warunkiem i już…
Po co z armatą na muchy;-)

Pozdrawiam
Marcin Staniszczak
Go to the top of the page
+Quote Post
Vengeance
post
Post #16





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


@MStaniszczak: podobnież "is_numeric(), is_integer(), intval()" nie są zawsze dobrym wyjściem. Gdzieś czytałem, iż Zend Engine działa tak, iż te funkcje sprawdzają tylko typ zmiennej. Może to doprowadzać do przekłamań, dlatego niektórzy właśnie stosują eregi (co w tamtym artykule także polecano).
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #17





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


@Vengeance:
Więc działa to tak:
is_numeric() - sprawdza czy cos co podałeś jako argument jest cyfrą. Dokładniej czy nie ważne czy cyfra jest stringiem ('123') czy cyfrą (123) czy cyfrą ułamkową (123.123). Jeśli jest cyfrą zwraca true;

is_integer() - zwraca true TYLKO wtedy gdy parametr:
a) jest cyfra
b) jest typu integer (czyli dla '123' nie zwróci true)
c) jest cyfrą CAŁKOWITĄ (czyli dla 123.123 nei zwróci true).
WSZYSTKIE te punkty muszą być spełnione jednocześnie

intval() - nic nie sprawdza... Zamienia parametr na integera (jesli zaczyna się od cyfry). Czyli:
  1. <?php
  2. $i = intval('123')
  3. ?>

powoduje przepisanie do $i wartości 123 typu INTEGER.
  1. <?php
  2. $i = intval('123 ala ma kota')
  3. ?>

działa podobnie - w $i otrzymujemy INTEGER-a o wartości 123.
Dodatkowo intval() ignoruje początkowe białe znaki i oczywiście poprawnie obsługuję znaki +/- przed cyfrą.
W przypadku niepoprawnego parametru podanego do intval:
  1. <?php
  2. $i = intval('ala ma kota');
  3. ?>

zwraca 0 (czyli w przykładzie $i otrzymuje wartość 0).

I NIE MA ODSTPSTW OD TYCH REGÓŁ.
Zamieszanie może powstać gdy się nie wie jak te funkcje działają (jest ich więcej - to tylko 3 z całej grupy). Ale to tak jak z operatorami...
Zobacz co da w wyniku:
  1. <?php
  2. $ret = '123 ala'+'123ma kota';
  3. echo $ret;
  4. ?>


Pozdrawiam
Marcin Staniszczak

Ten post edytował MStaniszczak 2.03.2005, 03:09:57
Go to the top of the page
+Quote Post
Vengeance
post
Post #18





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


@MStaniszczak: ja tam nie wiem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Mówie tylko co czytałem. Skoro ktoś to dostrzegł w kodzie Zend Engine (może go analizowałeś, ja nie) to miał jakieś powody by tak twierdzić (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Może już to poprawili albo coś. Przytaczam tylko swoją "wiedzę" na ten temat, choc sam także używam is_integer() itp.
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #19





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


@Vengeance: Ano analizowałem Zend Engina dość dokładnie (jeszcze raz mnie to czeka).
Oto funkcja odpowiedzialna za is_numeric (która nie jest częścią Zend Engine-u):

Kod
PHP_FUNCTION(is_numeric)
{
    zval **arg;
    int result;

    if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
  WRONG_PARAM_COUNT;
    }

    switch (Z_TYPE_PP(arg)) {
  case IS_LONG:
  case IS_DOUBLE:
     RETURN_TRUE;
     break;

  case IS_STRING:
     result = is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), NULL, NULL, 0);
     if (result == IS_LONG || result == IS_DOUBLE) {
    RETURN_TRUE;
     } else {
    RETURN_FALSE;
     }
     break;

  default:
     RETURN_FALSE;
     break;
    }
}


A to np. is_string:
Kod
PHP_FUNCTION(is_string)
{
    php_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_STRING);
}

do tego php_is_type:
Kod
static void php_is_type(INTERNAL_FUNCTION_PARAMETERS, int type)
{
    pval **arg;

    if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg) == FAILURE) {
  php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only one argument expected");
  RETURN_FALSE;
    }

    if (Z_TYPE_PP(arg) == type) {
  if (type == IS_OBJECT) {
     zend_class_entry *ce;
     ce = Z_OBJCE_PP(arg);
     if (!strcmp(ce->name, INCOMPLETE_CLASS)) {
    RETURN_FALSE;
     }
  }
  if (type == IS_RESOURCE) {
     char *type_name;
     type_name = zend_rsrc_list_get_rsrc_type(Z_LVAL_PP(arg) TSRMLS_CC);
     if (!type_name) {
    RETURN_FALSE;
     }
  }
  RETURN_TRUE;
    } else {
  RETURN_FALSE;
    }
}


A is_integer, is_double, is_real ma jeszcze ładniejszą postać (sam sprawdź). To nie może działać źle - używaj bez obaw;-)

Pozdrawiam
Marcin Staniszczak
Go to the top of the page
+Quote Post
krzemian
post
Post #20





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.01.2004
Skąd: Świętochłowice

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


W PHPBB też jest coś takiego używane, ale - znowu - nie prościej użyć rzutowania typów? Ostatnio zrobiłem coś takiego na zmiennej $id z GET'a i nawet jeśli dałem id=3fk5 to jeśli zrzutowałem to na (int) otrzymywałem 35. Chyba o to wam chodzi, nie?
Go to the top of the page
+Quote Post
Seth
post
Post #21





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


To o czym piszesz sprawdza sie przy liczbach, natomiast do ciagow znakow trzeba juz inaczej do tego podchodzic.
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #22





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


@krzemian:
Cytat
Ostatnio zrobiłem coś takiego na zmiennej $id z GET'a i nawet jeśli dałem id=3fk5 to jeśli zrzutowałem to na (int) otrzymywałem 35. Chyba o to wam chodzi, nie?


Ciekawe co piszesz - sprawdź co zwróci skrypt...
  1. <?php
  2. $x = '3fk5';
  3. $a = (int)'3fk5';
  4. $b = (int)$x;
  5.  
  6. echo $a.'<br>'.$b;
  7. ?>


A teraz popróbuj:

  1. <?php
  2. $a = '1abc';
  3. $b = '2ii';
  4. $d = '-3ala ma kota a kot ma ale';
  5.  
  6. $ret = $a+$b;
  7. echo $ret.'<br>';
  8.  
  9. $ret += $d;
  10. echo $ret.'<br>';
  11.  
  12. $ret = $b*$d;
  13. echo $ret.'<br>';
  14.  
  15. ?>


Pozdrawiam
Marcin Staniszczak
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #23





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Moze ktos napisze klase, lub zbiór funkcji, alby uniknąc tego typu problemów, tylko ze... tu problem nie polega na tym, co zrobic zeby sprawdzic jaki typ danych user wpisze, tylko raczej na tym jak mądrze napisac zapytanie.
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #24





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


Ja używam czegoś takiego (ma już swoje latka - dodałem tylko public;-):

  1. <?php
  2. require_once(ROOT_PATH.'Libraries/Tools/email.inc.php');
  3.  
  4. define('VALIDATE_EMAIL', 1);
  5. define('VALIDATE_STRING', 2);
  6. define('VALIDATE_INTEGER', 3);
  7. define('VALIDATE_DOUBLE', 4);
  8. define('VALIDATE_POSTCODE', 5);
  9. define('VALIDATE_BOOLEAN', 6);
  10.  
  11. class Validate {
  12. private function checkStrSize($value, $minSize, $maxSize) {
  13. if(strlen(trim($value))>$maxSize || strlen(trim($value))<$minSize)
  14. return false;
  15. else
  16. return true;
  17. }
  18.  
  19. //array( array('typ', 'value', 'min', 'max', 'correct')
  20. public function check($array) {
  21. $ret = array(true, $array);
  22.  
  23. $count = count($array);
  24. for($i=0; $i<$count; $i++) {
  25. switch($array[$i][0]) {
  26. case VALIDATE_EMAIL: // e-mail
  27. if(!tverifyEmail($array[$i][1])) {
  28. $ret[0] = false;
  29. $ret[1][$i][4] = false;
  30. } else
  31. $ret[1][$i][4] = true;
  32. break;
  33. case VALIDATE_STRING: // string
  34. if(!$this->checkStrSize($array[$i][1], $array[$i][2], $array[$i][3])) {
  35. $ret[0] = false;
  36. $ret[1][$i][4] = false;
  37. } else
  38. $ret[1][$i][4] = true;
  39. break;
  40. case VALIDATE_INTEGER: //integer
  41. if(!is_numeric($array[$i][1]) || 
  42. (strpos($array[$i][1], ',')!==false) || (strpos($array[$i][1], '.')!==false) ||
  43. $array[$i][1]<$array[$i][2] || $array[$i][1]>$array[$i][3]) {
  44. $ret[0] = false;
  45. $ret[1][$i][4] = false;
  46. } else
  47. $ret[1][$i][4] = true;
  48. break;
  49. case VALIDATE_DOUBLE: // double
  50. if(!is_numeric($array[$i][1]) || $array[$i][1]<$array[$i][2] || $array[$i][1]>$array[$i][3]) {
  51. $ret[0] = false;
  52. $ret[1][$i][4] = false;
  53. } else
  54. $ret[1][$i][4] = true;
  55. break;
  56. case VALIDATE_POSTCODE:
  57. if(!@ereg('^[0-9]{2}-[0-9]{3}$', $array[$i][1])) {
  58. $ret[0] = false;
  59. $ret[1][$i][4] = false;
  60. } else
  61. $ret[1][$i][4] = true;
  62. break;
  63. case VALIDATE_BOOLEAN:
  64. if(!is_bool($array[$i][1])) {
  65. $ret[0] = false;
  66. $ret[1][$i][4] = false;
  67. } else
  68. $ret[1][$i][4] = true;
  69. break;
  70. }
  71. }
  72.  
  73. return $ret;
  74. }
  75. }
  76. ?>


A plik email.inc.php:
  1. <?php
  2. if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
  3. $OS_detect = 'Windows NT';
  4. else
  5. $OS_detect = 'Unix';
  6.  
  7. function checkdnsrrWinNT($host, $type = '') {
  8. if(!empty($host)) {
  9.  
  10. if($type=='')
  11. $type = 'MX';
  12.  
  13. @exec(&#092;"nslookup -type=$type $host\", $output);
  14.  
  15. while(list($k, $line)=each($output)) {
  16. if(eregi( &#092;"^$host\", $line)) {
  17. return true;
  18. }
  19. }
  20. return false;
  21. }
  22. }
  23.  
  24.  
  25. function multiOScheckdnsrr($host, $type='') {
  26. global $OS_detect;
  27.  
  28. if(strcmp($OS_detect,'Windows NT')===0)
  29. return checkdnsrrWinNT($host, $type);
  30. else
  31. if(strcmp($OS_detect, 'Unix')===0) {
  32. if(strcmp($type, '')===|| strcmp($type, 'MX')===0)
  33. return checkdnsrr($host, MX);
  34. elseif(strcmp($type, 'A')===0)
  35. return checkdnsrr($host, A);
  36. elseif(strcmp($type, 'NS')===0)
  37. return checkdnsrr($host, NS);
  38. elseif(strcmp($type, 'SOA')===0)
  39. return checkdnsrr($host, SOA);
  40. elseif(strcmp($type, 'PTR')===0)
  41. return checkdnsrr($host, PTR);
  42. elseif(strcmp($type, 'CNAME')===0)
  43. return checkdnsrr($host, CNAME);
  44. elseif(strcmp($type, 'AAAA')===0)
  45. return checkdnsrr($host, AAAA);
  46. elseif(strcmp($type, 'ANY')===0)
  47. return checkdnsrr($host, ANY);
  48. }
  49. }
  50.  
  51. function verifyEmail($email) {
  52. $wholeexp = '/^(.+?)@(([a-z0-9.-]+?).[a-z]{2,5})$/i';
  53. $userexp = &#092;"/^[a-z0-9~!#$%&()-_+=[];:'\",./]+$/i\";
  54. if(preg_match($wholeexp, $email, $regs)) {
  55. $username = $regs[1];
  56. $host = $regs[2];
  57. if(multiOScheckdnsrr($host, 'MX')) {
  58. if(preg_match($userexp, $username)) {
  59. return true;
  60.  }else {
  61.  return false;
  62.  }
  63.  }else {
  64.  return false;
  65.  }
  66. }else {
  67. return false;
  68. }
  69. }
  70. ?>


Dalej validuje już w odpowiednich funkcjach - inaczej chyba ciężko;-)

Pozdrawiam
Marcin Staniszczak

Ten post edytował MStaniszczak 3.03.2005, 23:18:45
Go to the top of the page
+Quote Post
docent
post
Post #25





Grupa: Zarejestrowani
Postów: 34
Pomógł: 2
Dołączył: 21.11.2003
Skąd: Kraków

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


no to i moje 3 grosze. primo: nie ma to jak szczyt lenistwa:

Kod
foreach($_REQUEST as $key => $item) $$key = addslashes($item);


mam nadzieje, ze sie podoba (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) oczywiscie nie wszedzie uzyteczne, niekoniecznie optymalne i nie zawsze dzialamy tylko na $_REQUEST. ale mniej wiecej juz znacie geneze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) mozliwe modyfikacje oczywiscie:

Kod
foreach($_POST as $key => $item) $_POST[$key] = addslashes($item);


itd... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) zamiast addslashes mozna dac intvalue, albo i obydwa.. jesli nie frunie duzo danych to i tak nie bedzie roznicy w czasie wykonywania skryptu - a nie trzeba z dokladnoscia ksiegowego sprawdzac czy o czyms (czyt. ktorejs zmiennej) nie zapomnielismy

pierwsza metoda (dla nei wiedzacych) symuluje niejako Register Globals na On, czyli zamiast odwolywac sie do strval($_REQUEST['zmienna']) mozemy po wykonaniu tamtego odwolac sie po prostu do $zmienna, ktora juz jest sparsowana pod kategm 'nieporzadanej' zawartosci

EDIT:

dziala oczywiscie i w druga strone. jesli do $rekord zczytamy sobie jakies dane z bazy danych to mozna sobie leniwie wrzucic:

Kod
foreach($rekord as $key => $item) $rekord[$key] = stripslashes($item);


tylko nalezy pamietac, aby czytac dane za pomcoa mysql_fetch_assoc lub row - nie mysql_fetch_array, gdyz wtedy mamy podwojne klucze w tablicy i wiadomo co sie stanie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował docent 4.03.2005, 00:21:06
Go to the top of the page
+Quote Post
Vengeance
post
Post #26





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


@docent: szczerze to zadna nowosc (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)

----
Przez chwilke pomyslalem, ze mozna by zmienne przekazyawc przez:
www.site.com?int[postID]=4&string[mode]=showAll&bool[save]=true

I robic odpowiednie petle na tablicach, stosujac odpowiednie funkcje (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #27





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


Cytat
Przez chwilke pomyslalem, ze mozna by zmienne przekazyawc przez:
www.site.com?int[postID]=4&string[mode]=showAll&bool[save]=true

I robic odpowiednie petle na tablicach, stosujac odpowiednie funkcje smile.gif


I otrzymali byśmy w GET coś takiego:-) Więc bardzo miło;-)

Kod
Array
(
    [int] => Array
        (
            [postID] => 4
        )

    [string] => Array
        (
            [mode] => showAll
        )

    [bool] => Array
        (
            [save] => true
        )

)


Pozdrawiam
Marcin Staniszczak
Go to the top of the page
+Quote Post
docent
post
Post #28





Grupa: Zarejestrowani
Postów: 34
Pomógł: 2
Dołączył: 21.11.2003
Skąd: Kraków

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


Cytat(Vengeance @ 2005-03-04 20:04:20)
@docent: szczerze to zadna nowosc (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)

----
Przez chwilke pomyslalem, ze mozna by zmienne przekazyawc przez:
www.site.com?int[postID]=4&string[mode]=showAll&bool[save]=true

I robic odpowiednie petle na tablicach, stosujac odpowiednie funkcje (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

heihei ja nie mowie, ze nowowsc - ale informacja dla tych, ktorzy nie znaja (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) a istotnie - jest pomocna :] bardziej mnie interesowalo zdanie innych na ten temat - sposob w zasadzie sam sobie stwrozylem (choc pewnie kazdy na to wpadl we wlasnym zakresie) i interesowalo mnie tylko zdanie innych w tej kwestii (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
tara
post
Post #29





Grupa: Zarejestrowani
Postów: 147
Pomógł: 0
Dołączył: 3.03.2004
Skąd: śląsk

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


w sumei można też tak, np. dla newsów:
  1. <?php
  2.  
  3. if(isset($_GET['id'])) {
  4.   $query1 = &#092;"SELECT MAX(ID) FROM newsy\";
  5. list($d) = mysql_fetch_row(mysql_query ($query1));
  6.  
  7. if ($_GET['id']> $d) {
  8. print &#092;"Blad\";
  9. } else {
  10.  
  11. // kod 
  12.  
  13. }
  14. }
  15.  
  16. ?>


To blokuje wysiwetlanie newsa np. 9999 jak i tekstu. w zmiennej id.

Ten post edytował tara 2.04.2005, 17:33:28
Go to the top of the page
+Quote Post
limak
post
Post #30





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 13.03.2004
Skąd: Siemianowice Śl.

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


Cytat
To blokuje wysiwetlanie newsa np. 9999 jak i tekstu. w zmiennej id.
no dobra, ale to niewiele ma do zabiezpieczenia przed SQL Injection...
akurat wyswietlenie newsa nr 99999 nie wprowadza zadej nowej mozliwosci ataku....

wracając do tematu....

http://www.phpsolmag.org/pl/modules/wmpdow...php?cid=1&lid=6

tutaj jest darmowy artykuł z magazynu php solutions
Go to the top of the page
+Quote Post
tara
post
Post #31





Grupa: Zarejestrowani
Postów: 147
Pomógł: 0
Dołączył: 3.03.2004
Skąd: śląsk

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


heh no ale jak ktoś wprawdzi DROP TABLE itp. to też zablokuje (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
MoD
post
Post #32





Grupa: Zarejestrowani
Postów: 193
Pomógł: 0
Dołączył: 14.09.2003
Skąd: Brodnica (koło Torunia)

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


Cytat(MStaniszczak @ 2005-02-28 04:21:48)
Hmmm.... wykonanie ereg zajmuje nieco czasu (jak to wyrażeń regularnych). [...]

Szczerze mówiąc, to wolę stracić tą sekundę w czasie wykonywania skryptu niż stracić na bezpieczeństwie. I mniejszy bałagan w kodzie - jedna funkcja zamiast szeregu IF. A wyrażenie regularne można w razie czego łatwo zmodyfikować jeśli się znajdzie błąd.
Go to the top of the page
+Quote Post
tarlandil
post
Post #33





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 29.04.2005

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


IMHO dosc wygodna i bezpieczne rozwiazanie:
  1. <?php
  2.  
  3. function CheckValue($type,$v,$default=&#092;"\")
  4. {
  5. if (!function_exists(&#092;"CheckValue_$type\")) return \"\";
  6. $func=&#092;"CheckValue_$type\";
  7. return $func($v,$default);
  8. }
  9.  
  10. function SQLValue($type,$v,$default=&#092;"\")
  11. {
  12. if (!function_exists(&#092;"SQLValue_$type\")) return \"\";
  13. $func=&#092;"SQLValue_$type\";
  14. return $func($v,$default);
  15. }
  16. ?>


a potem definiujemy swoje funckje sprawdzajace
  1. <?php
  2.  
  3. function CheckValue_int($v,$default=&#092;"\")
  4. {
  5. if (!is_numeric($v)) return (int)$default;
  6. return (int) $v;
  7. }
  8.  
  9. function SQLValue_int($v,$default=&#092;"\")
  10. {
  11. return CheckValue_int($v,$default);
  12. }
  13.  
  14. function CheckValue_ident($v,$default=&#092;"\")
  15. {
  16. $v=trim($v);
  17. if (!preg_match(&#092;"/^([wd]+)$/\",$v)) return $default;
  18. return $v;
  19. }
  20.  
  21. function SQLValue_ident($v,$default=&#092;"\")
  22. {
  23. $v=CheckValue_ident($v,$default);
  24. $v=addslashes($v);
  25. return &#092;"'$v'\";
  26. }
  27.  
  28. function CheckValue_text($v,$default=&#092;"\")
  29. {
  30. $v=trim($v);
  31. $v=htmlspecialchars($v,ENT_QUOTES);
  32. return $v;
  33. }
  34.  
  35. function SQLValue_text($v,$default=&#092;"\")
  36. {
  37. $v=CheckValue_text($v,$default);
  38. $v=addslashes($v);
  39. return &#092;"'$v'\";
  40. }
  41.  
  42. itd..
  43.  
  44. ?>


a wykoanie zapytania np tak:
  1. <?php
  2.  
  3. $result=$sql->SendQuery(sprintf(
  4. &#092;"select * from przedmiot where id=%s and parent=%s;\",
  5. SQLValue(&#092;"ident\",$GLOBALS[\"id\"]),
  6. SQLValue(&#092;"ident\",$GLOBALS[\"parent\"])
  7. ));
  8.  
  9. ?>


I w ten sposob nawet przy braku magic quotes czy tez mozliwosci wielu zapytan w jednemy poleceniu, nikt nie przepcha zadnego zlosliwego kodu.

Ten post edytował tarlandil 29.04.2005, 07:50:11
Go to the top of the page
+Quote Post
Jarod
post
Post #34





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(Vengeance @ 2005-02-27 13:44:07)
przez mysql_query() nie. ale funckje postgreSQL już to dopuszczają :/
Dlatego userzy tego drugiego mają większy problem.

Co do zabezpieczenia, nie wiem czym się tak przejmujecie? ;]
Ja stosuje jedynie addslashes() oraz usuwam slowo 'UNION' ze zmiennych

Cytat
przez mysql_query() nie. ale funckje postgreSQL już to dopuszczają :/
Dlatego userzy tego drugiego mają większy problem.

A jak go rozwiązać?
Cytat
Co do zabezpieczenia, nie wiem czym się tak przejmujecie? ;]
Ja stosuje jedynie addslashes() oraz usuwam slowo 'UNION' ze zmiennych

Przecież addslashes() to tosamo co mysql_escape_string() (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)
Go to the top of the page
+Quote Post
sobstel
post
Post #35





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


Cytat(J4r0d @ 2005-05-08 17:11:33)
Cytat(Vengeance @ 2005-02-27 13:44:07)
przez mysql_query() nie. ale funckje postgreSQL już to dopuszczają :/
Dlatego userzy tego drugiego mają większy problem.

Co do zabezpieczenia, nie wiem czym się tak przejmujecie? ;]
Ja stosuje jedynie addslashes() oraz usuwam slowo 'UNION' ze zmiennych

Cytat
przez mysql_query() nie. ale funckje postgreSQL już to dopuszczają :/
Dlatego userzy tego drugiego mają większy problem.

A jak go rozwiązać?
Cytat
Co do zabezpieczenia, nie wiem czym się tak przejmujecie? ;]
Ja stosuje jedynie addslashes() oraz usuwam slowo 'UNION' ze zmiennych

Przecież addslashes() to tosamo co mysql_escape_string() (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)

1. np. mozna przefiltrowac ciag wyrzucajac wszelkie sredniki

2. funkcja nie sa sobie rownoznaczne

mysql_real_escape_string() calls MySQL's library function mysql_escape_string, which prepends backslashes to the following characters: NULL, \x00, \n, \r, \, ', " and \x1a.

addslashes() : Returns a string with backslashes before characters that need to be quoted in database queries etc. These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
Go to the top of the page
+Quote Post
johnson
post
Post #36





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 3.12.2004

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


Cytat(J4r0d @ 2005-05-08 16:40:02)
Więc, które rozwiązanie bezpieczniejsze? Stosować addslashes() ?

Nie rozumiem o co Wam chodzi z tym addslashes().
Czy chodzi o podwójne stosowanie addslashes()?
Raz przecież robi to samo php. Otrzymując dane z formularzy dostajemy postać:
To jest \"smaczny deser\"
Czy trzeba to jeszcze raz potraktować addslashes() i otrzymać:
To jest \\\"smaczny deser\\\"
i dopiero wtedy wrzucać do bazy? Już od dawna mnie frapuje ten problem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) czy może ktoś to wyjaśnić?
Go to the top of the page
+Quote Post
sobstel
post
Post #37





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


addslashes() (jeden raz!!!) powinno w zupelnosci wystarczyc. przy sotsowaniu mysql_escape_string moze sie pojawic porblem przy wyciganiu danych z bazy i stosowaniu stripslashes()
Go to the top of the page
+Quote Post
Peter Riley
post
Post #38





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 7.05.2005

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


Smieszne sa te wasze rozwazania, nie szkoda czasu?
Przypomina mi to wiare w zabobony.
Addslashes zalatwia calkowice sprawe, sprobujcie sie wlamac bez mozliwosci uzycia apostrofu. Mozecie wpisywac UNION, srednik i co tylko chcecie, ale to nic nie da, bo i tak co najwyzej zostanie wciagniete do bazy jako czesc stringa.
Do liczb is_numeric i wystarczy.
Go to the top of the page
+Quote Post
Jarod
post
Post #39





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat
Nie rozumiem o co Wam chodzi z tym addslashes().
Czy chodzi o podwójne stosowanie addslashes()?


Chodzi o to, że slash dodawany jest jeżeli włączona jest jakaś opcja (już nie pamiętam o jaką chodziło - szukaj na pierwszej stronie tego topicu).
A jak dodadsz addslashes() to nawet jak dodawanie slasha jest wyłączone to ty massz pewność.

Cytat
Smieszne sa te wasze rozwazania, nie szkoda czasu?
Przypomina mi to wiare w zabobony.

Bezpieczeństwo - szkoda czasu? (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif) Nie dla mnie :roll2:
Cytat
Addslashes zalatwia calkowice sprawe, sprobujcie sie wlamac bez mozliwosci uzycia apostrofu. Mozecie wpisywac UNION, srednik i co tylko chcecie, ale to nic nie da, bo i tak co najwyzej zostanie wciagniete do bazy jako czesc stringa.
Do liczb is_numeric i wystarczy.

Skoro tak mówisz to będę tak robił. Jaby co to wiemy do kogo z pretensjami (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Dziękuje za odpowiedź i pozdrawiam
Go to the top of the page
+Quote Post
Peter Riley
post
Post #40





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 7.05.2005

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


Cytat(J4r0d @ 2005-05-08 16:56:50)
Bezpieczeństwo - szkoda czasu?  (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)   Nie dla mnie :roll2:

A co z bezpieczenstwem ma wspolnego kasowanie ciagow typu UNION ze zmiennej, w ktorej i tak kazdy apostrof zostanie wysleszowany? Nic.
addslash lub magic quote zalatwia calkowicie sprawe sql injection, oczywiscie pozostaje sprawdzenie czy nadeslane dane mieszcza sie w dozwolonym zakresie, ale to juz inna historia.

Ten post edytował Peter Riley 8.05.2005, 18:45:39
Go to the top of the page
+Quote Post
Jarod
post
Post #41





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(Peter Riley @ 2005-05-08 17:43:03)
oczywiscie pozostaje sprawdzenie czy nadeslane dane mieszcza sie w dozwolonym zakresie, ale to juz inna historia.

Możesz rozwinąć?
Go to the top of the page
+Quote Post
Peter Riley
post
Post #42





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 7.05.2005

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


Cytat(J4r0d @ 2005-05-08 18:08:08)
Cytat(Peter Riley @ 2005-05-08 17:43:03)
oczywiscie pozostaje sprawdzenie czy nadeslane dane mieszcza sie w dozwolonym zakresie, ale to juz inna historia.

Możesz rozwinąć?

Po prostu musimy sprawdzic, czy przeslane wartosci maja odpowiedni przedzial, czyli np. wpisana ilosc sztuk nie przekracza stanu magazynu. W przypadku wartosci tekstowych mozna porownac wyszukac ciagu w zadeklarowanej wczesniej tablicy lub uzyc switch of. Jednak to wszystko nie ma nic wspolnego ze sql injection, przed ktorym pelna obrone zapewnia defaultowa konfguracja php, a jesli wylaczymy magic quote, pozostanie addslashes.
Go to the top of the page
+Quote Post
sobstel
post
Post #43





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


Cytat(Peter Riley @ 2005-05-08 18:43:03)
addslash lub magic quote zalatwia calkowicie sprawe sql injection

smiem twierdzic ze jest to zbyt odwazne stwierdzenie. wyobraz sobie taka sytuace :

URL: www.strona.php?articleid=12
filtrujemy: $id = addslashes($_GET['articleid'])
wstawiamy w zapytanie : query = 'SELECT * FROM articles WHERE id='.$id;

i teraz np. URL www.strona.php?articleid=12 OR 1

jak widzisz w tym przykladzie (co prawda dosc naiwnym) addslashes nie zalatwilo sprawy...
Go to the top of the page
+Quote Post
Kinool
post
Post #44





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

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


panowie!!!!

juz ktos pisal o tym ze wiemy co "spodziewamy" sie otrzymac jesli chodzi o liczby to nie addslashes tylko intval() lub settype()

$id = intval($_GET['articleid']);

i jesli gosc wklepie tam cokolwiek to i tak bedzie zutowane na liczbe
nawet ze wzglegow optymalizacji lepiej jest wykonac zapytanie
SELECT * FROM table WHERE id=10
niz
SELECT * FROM table WHERE id='10'
poniewaz MySQL nie musi robic konwersji

addslashes uzywamy jesli mamy doczynienia z wartosciami textowymi lub mieszanymi

tak na marginesie to zadna funkcja nie zwalnia od myslenia!

Ten post edytował Kinool 9.05.2005, 00:20:28
Go to the top of the page
+Quote Post
Peter Riley
post
Post #45





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 7.05.2005

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


Cytat(sopel @ 2005-05-08 21:14:33)
smiem twierdzic ze jest to zbyt odwazne stwierdzenie.

To chyba oczywiste, ze musimy sprawdzic czy liczby rzeczywiscie sa liczbami, przy okazji sprawdzajac ich zakres. Zreszta pisalem o tym wyzej. Dodam tylko, ze ja sklaniam sie raczej do sprawdzania typu, a nie konwersji na sile. Jesli typ sie nie zgadza, to mail do admina i die().

Nie jest to odwazne stwierdzenie tylko fakt. Zaloze sie, ze ci co usuwaja UNION i sredniki z ciagow, na wszelki wypadek klikaja "zastosuj" w windowsowych okienkach tuz przed kliknieciem "ok" :-)

Ten post edytował Peter Riley 9.05.2005, 01:32:48
Go to the top of the page
+Quote Post
ktuvok
post
Post #46





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

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


Dorzucę się do tego wątku i powiem, że moim zdaniem najlepszym zabezpieczeniem jest:

1. ustawienie w php.ini opcji get_magic_quotes_gpc na ON

2. stosowana równolegle z powyższym funkcja czyszcząca otrzymane dane - od razu uprzedzam, że wbrew nazwie nie dotyczy ona tylko danych przesyłanych metodą POST:
  1. <?php
  2.  
  3. function OczyscPost($Zmienna, $Rozmiar)
  4. {
  5. {
  6. $Zmienna = stripslashes($Zmienna);
  7. }
  8. $Zmienna = trim(strip_tags(str_replace(&#092;"\"\", \"\", $Zmienna)));
  9. $Zmienna = substr(str_replace(&#092;"'\",\"\", $Zmienna),0,$Rozmiar);
  10. $Zmienna = sprintf(&#092;"%s\",$Zmienna);
  11. return $Zmienna;
  12. }
  13.  
  14. ?>


3. Funkcja zapewniająca dodatkowe filtrowanie dla identyfikatorów, przekazywanych w URL'u:
  1. <?php
  2.  
  3. function DoCyfry($Zmienna)
  4. {
  5. $Zmienna = intval($Zmienna);
  6. if(is_int($Zmienna))
  7. {
  8. return $Zmienna;
  9. }
  10. else
  11. {
  12. return 0;
  13. }
  14. }
  15.  
  16. ?>


Zastosowanie:
  1. <?php
  2.  
  3. $Nazwisko = OczyscPost($_POST['Nazwisko'], 40);
  4. $ID = DoCyfry(OczyscPost($_GET['ID'], 10));
  5.  
  6. ?>


Jakieś uwagi?

Pozdrawiam,
K
Go to the top of the page
+Quote Post
Vengeance
post
Post #47





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


Cytat(Peter Riley @ 2005-05-08 19:43:03)
Cytat(J4r0d @ 2005-05-08 16:56:50)
Bezpieczeństwo - szkoda czasu?  (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)   Nie dla mnie :roll2:

A co z bezpieczenstwem ma wspolnego kasowanie ciagow typu UNION ze zmiennej, w ktorej i tak kazdy apostrof zostanie wysleszowany? Nic.
addslash lub magic quote zalatwia calkowicie sprawe sql injection, oczywiscie pozostaje sprawdzenie czy nadeslane dane mieszcza sie w dozwolonym zakresie, ale to juz inna historia.

Hyh... kompletnie się z Tobą nie zgodzę :]

Union da się wiele razy wykorzystać nie stosując nawet jednego apostrofu!
Więc samo używanie addslashes() w przypadku posiadania MySQL 4 nie jest bezpieczne !
Go to the top of the page
+Quote Post
bolas
post
Post #48





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 10.10.2004

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


a takie pytanko jeszcze.
czy umozliwienie stosowania wszystkich znakow np. spacji przy tworzeniu loginu podczas rejestracji jest niebezpieczne ?
Go to the top of the page
+Quote Post
bolas
post
Post #49





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 10.10.2004

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


wszystkie znaki - oczywiscie przy wlaczanej dyrektywie gpc_magic_quotes

ktuvok - uzywam podobnego mechanizmu i na razie nie ma problemow (moze dlatego, ze nikt nie robil testow, albo nie zauwazono, ze cos jest nie tak). dodatkowo uzywam htmlspecialchars.

Ten post edytował bolas 18.05.2005, 14:58:44
Go to the top of the page
+Quote Post
kubatron
post
Post #50





Grupa: Zarejestrowani
Postów: 581
Pomógł: 0
Dołączył: 21.07.2003
Skąd: Jasło

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


Nie wiem czy był dawany ten link lecz jeśli nie to prosze o usunięcie postu, a takto ciekawy art do przeczytanie http://www.computerworld.pl/artykuly/31505.html
Go to the top of the page
+Quote Post
gu35t
post
Post #51





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 15.05.2005

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


mozna sie legalnie sprawdzic:
http://peanix.ath.cx/

wiecej na:
http://forum.cc-team.org/viewtopic.php?t=6488
http://forum.cc-team.org/viewtopic.php?t=6680

sqli[taki bylejaki (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ]:
http://sld.org.pl/index.php?view=1&art_id=...et_id=16&rsid=4

i troche info:
http://www.microsoft.com/poland/technet/article/art008.mspx
http://www.unixwiz.net/techtips/sql-injection.html
http://www.google.pl/search?hl=pl&biw=1019...btnG=Szukaj&lr=
http://www.sitepoint.com/article/sql-injection-attacks-safe
http://www.securiteam.com/securityreviews/5DP0N1P76E.html
http://www.google.pl/search?hl=pl&biw=1019...btnG=Szukaj&lr=
http://www.google.pl/search?hl=pl&biw=1019...btnG=Szukaj&lr=
http://www.google.pl/search?hl=pl&biw=1019...btnG=Szukaj&lr=
http://www.google.pl/search?hl=pl&biw=1019...btnG=Szukaj&lr=
http://blogs.wdevs.com/colinangusmackay/ar.../09/25/652.aspx

troche o union:
http://www.really-fine.com/SQL_union.html

a tak wogule to wszystko na google jest tylko miej troche cierpliowsci i MYSL.

pozdro
Cytat
Union da się wiele razy wykorzystać nie stosując nawet jednego apostrofu!
Więc samo używanie addslashes() w przypadku posiadania MySQL 4 nie jest bezpieczne !

prawda vee (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
logeen
post
Post #52





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.07.2005

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


Cytat(Vengeance @ 2005-05-14 20:44:37)
Union da się wiele razy wykorzystać nie stosując nawet jednego apostrofu!
Więc samo używanie addslashes() w przypadku posiadania MySQL 4 nie jest bezpieczne !

Mam w takim razie pytanko: w jaki sposób wykonać SQL Injection w takim skrypcie:
  1. <?php
  2. // Łączenie z serwerem MySQL itd.
  3.  
  4. // Logowanie administratora:
  5. mysql_query('SELECT * FROM admins WHERE user_login = '' . (get_magic_quotes_gpc() ? $_POST['login'] : addslashes($_POST['login'])) . '' AND user_password = '' . (get_magic_quotes_gpc() ? $_POST['password'] : addslashes($_POST['password'])) . ''');
  6.  
  7. // Zmiana hasła:
  8. mysql_query('UPDATE users SET user_password = '' . (get_magic_quotes_gpc() ? $_POST['password'] : addslashes($_POST['password'])) . '' WHERE user_id = ' . abs(intval($_GET['user_id'])));
  9.  
  10. // Albo:
  11. mysql_query('UPDATE users SET user_password = '' . (get_magic_quotes_gpc() ? $_POST['password'] : addslashes($_POST['password'])) . '' WHERE user_login = '' . (get_magic_quotes_gpc() ? $_GET['login'] : addslashes($_GET['login'])) . ''');
  12.  
  13. // Operacje końcowe: zamykanie połączenia itd.
  14. ?>

Jakoś nie widzę tutaj możliwości wykorzystania UNION poprzez SQL Injection (IMG:http://forum.php.pl/style_emoticons/default/dry.gif)

Ten post edytował logeen 6.07.2005, 14:32:51
Go to the top of the page
+Quote Post
Vengeance
post
Post #53





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


Wiadomym jest, że nie w każdym się da... ale są przypadki gdzie tak jest. Przecież w UNION najczęściej chodzi o wyciągnięcie danych... więc nie musisz używać apostrofu. Gdy ktoś zrobi błąd w takim miejscu, iż użycie apostrofu nie jest wymagane (a najczęściej jest właśnie tylko w dyrektywach WHERE) to droga otwarta.
Go to the top of the page
+Quote Post
johnson
post
Post #54





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 3.12.2004

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


Nie zapominajmy, że przy union włamywacz musi znać nazwę tabeli i pól w tabeli mysql, a w przypadku, jeśli ktoś pisze skrypty sam i nie używa gotowców, prawdopodobieństwo, że włamywacz odgadnie nazwę tabeli i pola jest IMHO bardzo małe.
Go to the top of the page
+Quote Post
Vengeance
post
Post #55





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


IMHO pokaz mi programiste co nie trzyma loginow i hasel w tabeli nazwą zblizonej do 'users' :]

Pozatym... wywolujac kontrolowane bledy SQL mozna czesto poznac spora czesc struktury bazy SQL.

Ale ogólnie to masz racje (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
logeen
post
Post #56





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.07.2005

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


Cytat(Vengeance @ 2005-07-07 18:53:24)
Gdy ktoś zrobi błąd w takim miejscu, iż użycie apostrofu nie jest wymagane (a najczęściej jest właśnie tylko w dyrektywach WHERE) to droga otwarta.

Tutaj się zgodzę, ale powiedzcie mi w takim razie, po co sztucznie wywalać UNION ze wszystkich danych podstawianych do zapytania, jeżeli można je tak zabezpieczyć, że nigdy nie będzie możliwości wykonania SQL injection (np. tak jak zaprezentowałem powyżej)? Czy to nie jest paranoja? Gdyby programiści IPB byli tak na to wyczuleni, to na tym forum w treści postów w ogóle nie dałoby się wpisać słowa "UNION" i jeszcze kilku innych, a jak widać da się (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Vengeance
post
Post #57





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


Dlatego, że w takim forum wykonuje się masę zapytań i nie zawsze wszystkie 100% sprawdzisz. Więc lepiej w jednym miejscu filtrować niebezpieczne dane... by potem mieć pewność że do każdego zapytania dotrą w odpowiedniej formie... i że nie zapomnieliśmy gdzieś czegoś filtrować.
Go to the top of the page
+Quote Post
logeen
post
Post #58





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.07.2005

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


To jasne, ale zależy, co rozumiesz przez "filtrować". Jeżeli filtrowaniem nazywamy np. używanie funkcji "addslashes" czy "intval", to OK. Ale jeżeli to ma polegać na bezcelowym usuwaniu np. wszystkich wystąpień słowa "UNION" i innych podobnych z danych przesyłanych przez użytkownika, a podstawianych do zapytania, to ja tego nie rozumiem. Po co to usuwać, skoro i tak w żaden sposób nie może zaszkodzić, jeżeli odpowiednio przefiltrujemy dane? Na dodatek przez takie postępowanie zupełnie niepotrzebnie eliminujemy sobie możliwość wstawienia do bazy danych niektórych słów, co może być akurat potrzebne. Spróbujcie napisać np. tutorial używania unii w SQL, jeżeli z każdego tekstu wstawianego do bazy będziecie czyścić to słowo ;-)

Jak ktoś nie filtruje danych, to i tak żadne usuwanie "UNION" itp. mu nie pomoże, bo SQL injection można wykonać na wiele innych sposobów, kiedy nie przefiltrujemy danych wejściowych...
Go to the top of the page
+Quote Post
Vengeance
post
Post #59





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


1. A kto mówi że strona musi traktować o czymś gdzie wystąpi UNION.
2. Zobacz ile skryptów (np. phpbb) jest podatnych na tego typu ataki
Go to the top of the page
+Quote Post
logeen
post
Post #60





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.07.2005

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


ad.1) Czyli co? Jeżeli zamierzasz zbudować np. forum dyskusyjne przeznaczone do dyskusji na temat języka SQL, to nie będzie się go dało zabezpieczyć, bo w takim przypadku usuwanie "UNION" z treści wysyłanych postów jest absolutnie nie do przyjęcia, a tylko to dałoby wystarczające zabezpieczenie?

ad.2) Skrypty są podatne, ponieważ programiści zapomnieli przefiltrować dane. Gdyby to zrobili, to by nie były podatne. Usuwanie "UNION" tutaj nic nie zmieni, ponieważ jeżeli dane wejściowe potraktujemy odpowiednio "addslashes" czy "intval", to żadne "UNION" przemycone w treści nam nie zaszkodzi. Do tego właśnie zmierzało moje pytanie, na które do tej pory nikt nie odpowiedział jasno i wyraźnie: czy jeśli stosujemy odpowiednią filtrację danych (np. taką jak zaprezentowałem), to wstawienie przez użytkownika "UNION" w danych wejściowych może się źle skończyć?
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #61





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


Nie ma sensu nic wywalać (filtrować żadnych słów). Grunt to dobrze wstawiać slashe a tam gdzie ich nie można dodać (np. identyfikatory) stosować odpowiednio is_number, is_integer, intval etc… Nie da rady o tym zapomnieć;-)

Dobry sposobem mogą być filtry w frameworku;-) Ew. klasa z metodami sprawdzającymi dane odpowiednich typów, a wówczaj wystarczy już coś w stylui:
  1. <?php
  2. try {
  3.  $id = CheckData::integer($_GET[&#8216;id’]);
  4.  $name = CheckData::string($_POST[&#8216;name’]);
  5.  $postcode = CheckData::postcode($_POST[&#8216;postCode’]);
  6. } catch(DataFormatException $e) {
  7.  echo &#092;"Zły format danych\";
  8. }
  9. ?>


Czy jakoś tak;-) Przy takiej organizacji łatwiej nawet poprawić ew. błąd czy luke w sposobie sprawdzania danych;-)

Pozdrawiam
Marcin Staniszczak

Ten post edytował MStaniszczak 8.07.2005, 09:39:33
Go to the top of the page
+Quote Post
Imperior
post
Post #62





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 16.10.2004

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


Oświećcie mnie proszę i powiedzcie, gdzie przy zdrowych zmysłach programista może zostawić lukę, że można użyć UNION bez ani jednego apostrofa? Przecież to jest możliwe tylko przy czymś takim:

  1. SELECT *
  2. FROM users WHERE id = $string


O czym wogóle rozmawiacie... tak robią tylko początkujący-nieuświadomieni.
Go to the top of the page
+Quote Post
Vengeance
post
Post #63





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


Imperior... są nawet tacy co robią

  1. SELECT *
  2. FROM users $warunki


Widac, ze analizowales malo skryptów i mało skomplikowanych zapytań widziałeś.

Cytat
tak robią tylko początkujący-nieuświadomieni

O ile mi wiadomo, to forum i ten wątek jest także dla takich a my staramy się ich uświadomić co może być błędem.

@logeen:
AD2. Prawdopodobnie masz racje i wykorzystanie wszędzie odpowiednich filtrów intval() itd... wystarczy, ALE

Mała opowieść:
Cytat
Zostałem adminem forum szkolnego. Obecnie jedyna możliwość posiadania dość fajnego i darmowego forum to phpBB. Pozatym
wcześniej też takie tam było i użytkownicy się przyzwyczaili.
Zrobiłem update do najnowszej wersji, ale wiadomo że i tak znajdą jakieś błędy (i znaleźli). Trzeba było więc zastosować właśne zabezpieczenia. Przecież nie będę naprawiał całego phpBB i w odpowiednich miejscach dawał intval() tam gdzie oni zapomnieli!

Zrobilem tak więc filtrację danych z GET i usuwam wszystkie "UNION".
Jeśli znajdziesz mi podobne w szybkosći implementacji i pod względem bezpieczeństwa rozwiązanie to z chęcią wysłucham.

A na forum dalej można pisać UNION gdyż filtruje tylko GET (phpBB do wszelkich rzeczy używa naszczęście tablic GET/POST/COOKIE a nie jedzie na superglobalach.
Go to the top of the page
+Quote Post
logeen
post
Post #64





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.07.2005

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


@Vengeance: Z tą opowieścią, to się z Tobą zgodzę. Z tym, że są pewne "ale":

1. Ten temat chyba raczej miał na celu przedstawienia zasad takiego pisania skryptów, aby nie były podatne na SQL injection, a nie poprawiania gotowych skryptów. Więc w przypadku, który podałeś, takie postępowanie może być uzasadnione, ale chyba raczej nie w sytuacji, kiedy piszemy cały skrypt od nowa.

2. Jeżeli w sytuacji, którą przedstawiłeś, nie przefiltruje się odpowiednio danych, to i tak usuwanie "UNION" niekoniecznie da 100% bezpieczeństwo, bo przecież są inne sposoby wykonania SQL injection niż tylko za pomocą unii. Natomiast faktycznie w sytuacji konieczności porawiania istniejących dziurawych skryptów, lepsze takie zabezpieczenie niż żadne.

3. Dane $_POST też przecież można spreparować, po prostu tworząc odpowiedni formularz i go wysyłając do skryptu (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) Co wiecej, można zrobić tak, żeby taki formularz wysłał nieświadomie administrator forum.
Go to the top of the page
+Quote Post
Vengeance
post
Post #65





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


@logeen: Ale powiedzmy sobie prawde, że fora szkolne "hakują" tylko gówniarze co potrafią jedynie ściągnąć sploita z internetu. A te korzystają wyłącznie z GET i najczęściej właśnie z UNION (w przypadku phpBB). Ja nie mówie o pełnym zabezpieczeniu gotowca (bo to niemożliwe) ale o "zawężeniu kręgu niebezpieczeństwa" :]

Chyba doszliśmy do porozumienia (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
johnson
post
Post #66





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 3.12.2004

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


Mówcie co chcecie, ale czy jest ktoś w stanie podać konkretny zestaw zabezpieczeń, który ustrzeże nas przed atakami poprzez php (oczywiście takie, które zależą od programisty) czy może nie ma sposobu na 100%-owe zabezpieczenie skryptów?
Go to the top of the page
+Quote Post
logeen
post
Post #67





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.07.2005

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


@johnson:
Odpowiedź brzmi: pełna filtracja (tzn. "addslashes", "intval" itp.) wszystkich danych zewnętrznych, które podstawiamy do zapytania SQL. Oczywiście jeżeli piszesz skrypt od zera, bo jeżeli poprawiasz bezpieczeństwo jakiegoś dziurawego gotowca, to trudno Ci będzie sprawdzić wszystkie linie kodu (ale nie jest to niewykonalne, bo tak naprawdę musimy odszukać tylko miejsca wywoływania zapytań SQL i sprawdzić, czy wszystkie zmienne podstawiane do kodu SQL są przefiltrowane) - wtedy można się dodatkowo zdecydować na rozwiązanie podane przez Vengeance, choć i tak nie będzie to pełne zabezpieczenie, niemniej powinno powstrzymać większość script kiddies.

Ten post edytował logeen 8.07.2005, 13:34:56
Go to the top of the page
+Quote Post
brachu
post
Post #68





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 13.04.2005

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


jezeli mozna wtracic swoje 3 grosze.... to testowalem swoj system zlecen i o dziwo nie mozna sie do niego dostac za pomoca SQL injection, zasluga jest to domyslnych ustawien serwera oraz kilku funkcji sprawdzajacych poprawnosc - ktore wcale nie byly pisane w tym celu.... ogolnie warto jest pisac funkcje sprawdzajace poprawnosc wpisanych przez uzytkownika wartosci - nawet po to aby uniknac wpisywania glupot w wypadku gdy uzytkownikowi pomieszaja sie pola formularza (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

pozdrawiam
Go to the top of the page
+Quote Post
MStaniszczak
post
Post #69





Grupa: Zarejestrowani
Postów: 71
Pomógł: 1
Dołączył: 3.10.2004

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


A tu http://www.gajdaw.pl/varia/xss.html macie coś o atakcha na strony (nie SQL Injection więc troche OT;-) )

Pozdrawiam
Marcin Staniszczak
Go to the top of the page
+Quote Post
moron
post
Post #70





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 24.08.2005

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


czyli co? mysql_escape_string, stripslashes (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
moglby ktos napisac jakas funkcje ktora by to robila?
Go to the top of the page
+Quote Post
logeen
post
Post #71





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.07.2005

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


  1. <?php
  2. /**
  3.  * Wstawia znaki unikowe w zapytaniach, dzieki czemu zapobiega atakowi "SQL injection".
  4.  * @param string $text Ciag tekstowy do zamiany
  5.  * @param resource $handle Identyfikator polaczenia
  6.  * @return string Ciag tekstowy po zamianie
  7.  */
  8. function mysql_escape($text, $handle=NULL)
  9. {
  10.     if (version_compare(phpversion(), '4.3.0', '>='))
  11.     {
  12.         if ($handle) return mysql_real_escape_string($text, $handle);
  13.         return mysql_real_escape_string($text);
  14.     }
  15. if (version_compare(phpversion(), '4.0.3', '>=')) return mysql_escape_string($text);
  16.     return addslashes($text);
  17. }
  18. ?>


Ten post edytował logeen 22.10.2005, 13:58:36
Go to the top of the page
+Quote Post
qeuw
post
Post #72





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 22.02.2004

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


Jak można zabazpieczyć stronę jeżeli mam where id=$_GET['id'] and password=$password, wtedy wpisując kod w $_GET['id']= '7 --'
Zaniecha mi sprawdzanie hasła. Te funckje działają tylko w ściśle określonych przypadkach. Jak można było by zabezpieczyc przed pytaniami or,select,delete, into,update, w tablicy _GET, i mieć jakąś tam pewność że skrypt będzie zabezpieczony.
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #73





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Cytat
Jak można zabazpieczyć stronę jeżeli mam where id=$_GET['id'] and password=$password, wtedy wpisując kod w $_GET['id']= '7 --'

uzyj is_numeric na $_GET['id']
Go to the top of the page
+Quote Post
h.4
post
Post #74





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 29.06.2005

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


Mam takie pytanie...

  1. <?php
  2.  
  3. $_POST['komentarz'] = mysql_real_escape_string($_POST['komentarz'];
  4. $_POST['komentarz2'] = mysql_real_escape_string($_POST['komentarz2'];
  5. $_POST['komentarz3'] = mysql_real_escape_string($_POST['komentarz3'];
  6.  
  7. ?>


i teraz jak zrobic zeby wszystkie dane z _POST przepuscic przez mysql_real_escape_string bez koniecznosci powtarzania tej funkcji do kazdej zmiennej... tylko zrobic to hurtem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

please help
Go to the top of the page
+Quote Post
ActivePlayer
post
Post #75





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Cytat
a jeśli zamiast _GET będzie _POST z jakimś tekstem?

to obejmiesz te dane w ' i wykonasz na nich mysql_escape_string()
Go to the top of the page
+Quote Post
wojto
post
Post #76





Grupa: Zarejestrowani
Postów: 158
Pomógł: 0
Dołączył: 29.06.2003
Skąd: Warszawa

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


Cytat(h.4 @ 2005-09-28 19:05:34)
i teraz jak zrobic zeby wszystkie dane z _POST przepuscic przez mysql_real_escape_string bez koniecznosci powtarzania tej funkcji do kazdej zmiennej... tylko zrobic to hurtem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

  1. <?php
  2. foreach($_POST as $a => $b) {
  3. $_POST[$a] = mysql_real_escape_string($b);
  4. }
  5.  
  6. ?>
?
Go to the top of the page
+Quote Post
qeuw
post
Post #77





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 22.02.2004

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


Otóz zrobilem funckje która zamienia wyrażenia sql na np. z UnIoN na !union!. Sądze że to w miare skuteczna metota gdzyż zawiera popularną składnie sql + wyrażenia opisane w phpmyadminie na stronie ze statystykami. A co to tej pętli to się bardzo mi przyda (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
logeen
post
Post #78





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 6.07.2005

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


Cytat(qeuw @ 2005-09-28 20:08:04)
Otóz zrobilem funckje która zamienia wyrażenia sql na np.  z UnIoN na !union!. Sądze że to w miare skuteczna metota...

Fakt... tylko po co? KAŻDE zapytanie można skutecznie zabezpieczyć przed SQL Injection, bez usuwania z niego słów kluczowych SQLa, a jedynie poprzez odpowiednią filtrację danych, przed podstawieniem ich do zapytania. Przez "Filtrację" rozumiem wykonania np. addslashes (albo lepiej funkcji, którą podałem wcześniej) lub np. intval tam, gdzie jest to konieczne - w zależności od kontekstu. Ciekaw jestem jak rozwiążesz sprawę, kiedy "UNION" powinno się zapisać w bazie danych, np. w jakiejś treści wyświetlanej później na stronie WWW? Fakt, można zamieniać np. na "!union!", a potem przy wyświetlaniu z powrotem na "UNION", ale po co? Jak ktoś mi pokaże jak wykorzystać "UNION" do wykonania SQL Injection w prawidłowo zabezpieczonym skrypcie - np. takim, jak podawałem w tym temacie kilka postów wcześniej - to będę bardzo wdzięczny. Wg mnie jest to niemożliwe. Po co w takim razie narzucać sobie jakieś sztuczne ograniczenia, polegające na niemożności wystąpienia w rekordach bazy danych jakichś słów (np. "UNION")?

Ten post edytował logeen 29.09.2005, 20:01:40
Go to the top of the page
+Quote Post
MalyKazio
post
Post #79





Grupa: Zarejestrowani
Postów: 168
Pomógł: 1
Dołączył: 19.11.2005

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


Prawdę mówiąc ten temat jest strasznie zaśmiecony. Niby ktoś pisał, że ma być też pomoca dla początkujących a jedyną rzeczą przydatną dla mnie, jako bardzo początkującego, było słowo addslashes. Niestety nic poza tym... Ani jak to wykorzystać ani jak to potem wyciągnąć z bazy danych... trochę szkoda bo gdy założyłem temat z prośbą o prostą odpowiedź ( http://forum.php.pl/index.php?showtopic=40200 ) to mi się trochę "oberwało" a temat przyklejony to dla początkującego uzytkownika czarna magia.
Go to the top of the page
+Quote Post
Vengeance
post
Post #80





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


MalyKazio: Znów ci się "oberwie" odemnie osobiście, bo skoro piszesz, że w tym temacie nic nie znalazłeś prócz addslashes() to śmię twierdzić, że czytać nie potrafisz i analizować kodów też nie!

Wiadomo, ile ludzi tyleż opini, dlatego w tym wątku znaleść można prawdziwe multum informacji o tym jak się zabezpieczyć. I nikt nie napiszę Ci jednego 100% sposobu - bo taki nie istnieje. Każdy ma jakieś zalety i wady, każda osoba faworyzuje innych.

Ktoś ci napiszę "używaj addslashes" a potem odnajdą lukę w tej funkcji i cała koncepcja bierze w łęb :]

Jeśli szukasz posegregowanych informacji to odsyłam do książek i artykułów. Tutaj jest forum, i nikt nie będzie edytował każdego postu tak aby początkujący mógł odczytać to jako książkę :/ A że się 5 stron czytać dokładnie ludziom nie chce.... no sorry.
Go to the top of the page
+Quote Post
the_foe
post
Post #81





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 26.08.2003

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


  1. <?php
  2. $win="\xA5\xC6\xCA\xA3\xD1\xD3\x8C\x8F\xAF\xB9\xE6\xEA\xB3\xF1\xF3\x9C\x9F\xBF";
  3. $iso="\xA1\xA6\xAC\xB1\xB6\xBC";
  4. $preg="/[^".$win.$iso."A-Za-z0-9_ -!@#\$%\^*\(\)\+=\{\}:;,.\\|\/\?]/s";
  5.  
  6. foreach ($_GET as $k=>$v){
  7. $_GET[$k]=preg_replace($preg,"\\1",$v);
  8. }
  9. foreach ($_POST as $k=>$v){
  10. $_POST[$k]=preg_replace($preg,"\\1",$v);
  11. }
  12. foreach ($_COOKIE as $k=>$v){
  13. $_COOKIE[$k]=preg_replace($preg,"\\1",$v);
  14. }
  15.  
  16. ?>


i po sprawie, nikt nie podskoczy
(mozna jeszcze trimowac, ale preg_replace nie przpusci chyba zero byte?)
Go to the top of the page
+Quote Post
kofaniutki_misio
post
Post #82





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 9.11.2005

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


Witam,

Czytałem posty na temat zabezpieczeń na stronie i zebrałem wszystko do kupy i wyszło mi coś takiego:

  1. <?
  2.  
  3. Function logs($msg) 
  4. { 
  5. global $HTTP_USER_AGENT, $_SERVER; 
  6. $url = sprintf("%s%s%s","http://",$_SERVER['HTTP_HOST'],$_SERVER['REQUEST_URI']); 
  7. $plik='http'; 
  8. if($_SERVER['HTTPS']=='on') 
  9.  { 
  10. $plik.='s'; 
  11. } 
  12. $plik.='://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']; 
  13. if($_SERVER['QUERY_STRING']>' ') 
  14. { 
  15. $plik.='?'.$_SERVER['QUERY_STRING']; 
  16. } 
  17. if ($_SERVER["HTTP_X_FORWARDED_FOR"]) 
  18. { 
  19. if ($_SERVER["HTTP_CLIENT_IP"]) 
  20. { 
  21. $mz_user['proxy']=$_SERVER["HTTP_CLIENT_IP"]; 
  22. }else 
  23. { 
  24. $mz_user['proxy']=$_SERVER["REMOTE_ADDR"]; 
  25. } 
  26. $mz_user['ip']=$_SERVER["HTTP_X_FORWARDED_FOR"]; 
  27. }else 
  28. { 
  29. if ($_SERVER["HTTP_CLIENT_IP"]) 
  30. { 
  31. $mz_user['ip']=$_SERVER["HTTP_CLIENT_IP"]; 
  32. }else 
  33. { 
  34. $mz_user['ip']=$_SERVER["REMOTE_ADDR"]; 
  35. } 
  36. } 
  37. $h=@fopen('logs/logs.txt','a'); // pamietaj aby ustawic chmod na 622 
  38. @fwrite($h,date('H:i:s d-m-Y').'  ip: '.$mz_user['ip'].' proxy: '.$mz_user['proxy'].' plik: '.$plik.' url: '.$url.' atak na zmienną: $'.$msg.' '); 
  39. @fclose($h); 
  40. return $msg; 
  41. } 
  42.  
  43. //zabezpieczenia zmiennych
  44.  
  45. $akcja = $_GET['akcja'];
  46. $id = (int)$_GET['id'];
  47.  
  48. preg_replace( '%<script>%', '', $akcja);
  49. preg_replace( '%UNION%', '', $akcja);
  50.  
  51. $akcja = mysql_escape_string($akcja); 
  52.  
  53. if(!ereg ("[a-z_]", $akcja)) {
  54.  logs('akcja');
  55.  die('Naruszenie zasad bezpiczeństwa! Twoj adres IP został pobrany.');}
  56.  
  57. if(!ereg ("[0-9]", $id)) {
  58.  logs('id');
  59.  die('Naruszenie zasad bezpiczeństwa! Twoj adres IP został pobrany.');}
  60.  
  61.  
  62. //koniec zabezpiczeń zmiennych
  63.  
  64. ?>


funkcja logs wyrzuca do pliku bardzo przydatne informacje o gościu który próbuje cos namieszać. W postaci np:

"18:21:38 26-02-2006
ip: 127.0.0.1
proxy:
plik: http://localhost/~www/zabezpieczenia.php
url: http://localhost/~www/zabezpieczenia.php
atak na zmienną: $akcja"


Co tu jest niepotrzebne? a co źle!!

Dodam ze metoda ma pobierac z linku dwie zmienne $akcja i $id dla późniejszego użycia zapytania SQL. $akcja ma zawierać tylko ciąg małych literek a $id tylko liczbe.

Pozdrawiam.
Go to the top of the page
+Quote Post
vedeney
post
Post #83





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 28.02.2006
Skąd: 127.0.0.1 :) => Ukraine

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


Sorry that not Polish,
but your functions are so funny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

e.g.
Why do you make global $_SERVER?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?
  1. <?php
  2. global $HTTP_USER_AGENT, $_SERVER;
  3. ?>

I can`t explane it.

  1. <?php
  2. preg_replace( '%UNION%', '', $akcja)
  3. ?>

AND
Kod
UNI/**/ON

OOPS (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

  1. <?php
  2.  
  3. foreach ($_GET as $k=>$v){
  4. $_GET[$k]=preg_replace($preg,"\\1",$v);
  5. }
  6. foreach ($_POST as $k=>$v){
  7. $_POST[$k]=preg_replace($preg,"\\1",$v);
  8. }
  9. foreach ($_COOKIE as $k=>$v){
  10. $_COOKIE[$k]=preg_replace($preg,"\\1",$v);
  11. }
  12. ?>

Have you ever here about $_REQUEST?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) No?

Ten post edytował vedeney 28.02.2006, 14:34:10
Go to the top of the page
+Quote Post
kofaniutki_misio
post
Post #84





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 9.11.2005

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


hej vedeney. funkcja logs, jest przepisana. Global mozna wyrzucic. Ale czemu nie rozumiesz zastosowania tego kodu:

  1. <?php
  2. preg_replace( '%UNION%', '', $akcja);
  3. ?>


chcialem żeby nie mozna bylo użyć polecenia UNION.

  1. <?php
  2. http://mojastron.php?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
  3. INFORMATION_SCHEMA.TABLES--
  4. ?>


wyciągania wszystkich tabel.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #85





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


  1. <?php
  2. $age = $_GET[ 'age' ]; // pomiijam sprawdzanie czy to w ogole istnieje
  3. $name = $_GET['name' ];
  4.  
  5. $intAge = intval( $age )
  6. $strName = mysql_real_escape( $name ); // moglem pomylic nazwe funkcji
  7. $sql = "SELECT some_column FROM users WHERE age = " . $intAge . " AND name = '" . $strName . "'";
  8. ?>

i to tyle, zadne pregi, bo po co

gdy pod $age wstawisz "UNION .....blalba.... --"
$intAge == 0

gdy pod $name wstawisz "UNION .....blalba.... --"
sql wyglada tak
  1. SELECT some_column
  2. FROM users
  3. WHERE age = 0 AND name = 'UNION.... blalbba..--'


bylo to juz wspominane na poczatku (lub dalej (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ) tego watka ale zginelo w masie postow probujacych to uzyskac.
Go to the top of the page
+Quote Post
vedeney
post
Post #86





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 28.02.2006
Skąd: 127.0.0.1 :) => Ukraine

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


Ok! I`ve understand you, But your code didn`t prevent such hack as
Kod
http://mojastron.php?id=10 UN/**/ION SEL/**/ECT bla bla bla....

Which will be executed without any problems;
or
Kod
http://mojastron.php?id=BENCHMARK(1000000,MD5(NOW()))

or
Kod
http://mojastron.php?id=BENCHMARK(1000000,BENCHMARK(1000000,BENCHMARK(1000000,MD5(NOW()))))

It`s DOS through MySql-injection (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif)
Go to the top of the page
+Quote Post
the_foe
post
Post #87





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 26.08.2003

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


Cytat(vedeney @ 2006-02-28 14:33:07)
  1. <?php
  2. foreach ($_GET as $k=>$v){
  3. $_GET[$k]=preg_replace($preg,"\\1",$v);
  4. }
  5. foreach ($_POST as $k=>$v){
  6. $_POST[$k]=preg_replace($preg,"\\1",$v);
  7. }
  8. foreach ($_COOKIE as $k=>$v){
  9. $_COOKIE[$k]=preg_replace($preg,"\\1",$v);
  10. }
  11. ?>

Have you ever here about  $_REQUEST?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) No?

Yes, I've heard about $_REQUEST. But it's another stupid thing like register_globals on is. Let the manual speak:

Cytat
$_REQUEST
    Variables provided to the script via the GET, POST, and COOKIE input mechanisms, and which therefore cannot be trusted. The presence and order of variable inclusion in this array is defined according to the php variables_order configuration directive. This array has no direct analogue in versions of php prior to 4.1.0. See also import_request_variables().


Ain't simple?
if you use _REQUEST, as foreach source, you won't be able to set cookie, set GET, set POST with the same string name! You will be forced to remember about it all time.

Additionaly, here's no problem with my code, you can use _REQUEST in spite of. If you realy like it.
Go to the top of the page
+Quote Post
LamaMASTER
post
Post #88





Grupa: Zarejestrowani
Postów: 160
Pomógł: 0
Dołączył: 27.03.2006

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


Cytat
zabezpieczenie w stylu:
  1. <?php
  2. $query = 'update `uzytkownicy` set `pole`="'.$dane.'" where `id`="'.$id.'";';
  3. ?>
to jak juz powiedziano zadne zabezpieczenie a pozatym zmnijsza wydajnosc zapytania, umieszczanie wartosci liczbowych w momiedzy " " powiduje iz MySQL mysli ze ma do czynienia ze znakami (stringami) i niepotzrebnie musi konwertowac typy.

Bzdura. Zapisz taki jest jak najbardziej szybszy, bo kod nie jest parsowany (bo jest w ' '), a zapisując zmienną w cudzysłowiach w kodzie ("coś tam $zmienna") powoduje parsowanie kodu i dłuższe sprawdzanie zmiennych. Nie wprowadzajcie ludzi w błąd.
Cytat
przyklad:
  1. <?php
  2.  
  3. $sql = mysql_query("SELECT * FROM news WHERE id=".$_GET['id']);
  4.  
  5. ?>


wywołanie normalne:
Kod
news.php?id=1
news.php?id=25
itd


wywołanie zmodyfikowane przez kogostam
np.
Kod
news.php?id=1;DROP%20TABLE%20news;

Ee tam, zonwu zonk, przecież mysql_query pozwala na wysłanie tylko jednego zapytania, więc to co pokazałeś nic nie da.

Więcej tematu czytać mi się nie chciało, ale mam nadzieję, że nie ma tam dalej więcej bzdur (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Pawel86
post
Post #89





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 5.04.2006

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


A takie rozwiazanie:
  1. <?php
  2.  
  3.  function ParseText(&$Text)
  4.    {
  5.       $Text=trim($Text);
  6.       if(get_magic_quotes_gpc())
  7.       {
  8.          $Text = stripslashes($Text);
  9.       }
  10.       $Text = htmlspecialchars($Text, ENT_QUOTES);
  11.       $Text = str_replace('\\0','\\\\0',$Text);
  12.       $Text = str_replace('\\t','\\\\t',$Text);
  13.       $Text = str_replace('\\n','\\\\n',$Text);
  14.       $Text = str_replace('\\r','\\\\r',$Text);
  15.       return $Text;
  16.    }
  17.  
  18.    function SecureSuperglobalsTables()
  19.    {
  20.       $this->SecureTable($_POST);
  21.       $this->SecureTable($_GET);
  22.       .....
  23.    }
  24.  
  25.    function SecureTable(&$Table)
  26.    {
  27.       if(!is_array($Table)) return false;
  28.       foreach($Table as $Id=>$Row)
  29.       {
  30.          if(is_array($Row))
  31.          {
  32.             $this->SecureTable($Table[$Id]);
  33.          }
  34.          else $this->ParseText($Table[$Id]);
  35.       }
  36.    }
  37.  
  38. ?>

XSS-y wykluczone, ' i " zamieniane na bezpieczne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) da sie to obejsc?

Ten post edytował Pawel86 6.04.2006, 07:51:35
Go to the top of the page
+Quote Post
Janek111
post
Post #90





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 24.04.2005

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


Mam taki problem:
Jesli uzyje mysql_real_escape_string i jesli jest wlaczone magic quotes to otrzymam przykladowo ze stringu jakis'wyraz, string jakis///'wyraz. Moglbym zrobic tak:
  1. <?php
  2.  
  3.    $string = mysql_real_escape_string($string);
  4.  
  5. ?>

tylko, że wtedy, jeśli jest wlaczone magic_quotes to stosowanie tej funkcji jest bezsensu - gdy uzyje addslashes wyjdzie na to samo.
jak mozna rozwiazac ten problem?? Moze poprostu zostac przy addslashes ? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Janek111 17.04.2006, 10:54:39
Go to the top of the page
+Quote Post
Jarod
post
Post #91





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(ktuvok @ 14.05.2005, 19:58 ) *
Dorzucę się do tego wątku i powiem, że moim zdaniem najlepszym zabezpieczeniem jest:

1. ustawienie w php.ini opcji get_magic_quotes_gpc na ON

2. stosowana równolegle z powyższym funkcja czyszcząca otrzymane dane - od razu uprzedzam, że wbrew nazwie nie dotyczy ona tylko danych przesyłanych metodą POST:
  1. <?php
  2.  
  3. function OczyscPost($Zmienna, $Rozmiar)
  4. {
  5. {
  6. $Zmienna = stripslashes($Zmienna);
  7. }
  8. $Zmienna = trim(strip_tags(str_replace(""", "", $Zmienna)));
  9. $Zmienna = substr(str_replace("'","", $Zmienna),0,$Rozmiar);
  10. $Zmienna = sprintf("%s",$Zmienna);
  11. return $Zmienna;
  12. }
  13.  
  14. ?>


3. Funkcja zapewniająca dodatkowe filtrowanie dla identyfikatorów, przekazywanych w URL'u:
  1. <?php
  2.  
  3. function DoCyfry($Zmienna)
  4. {
  5. $Zmienna = intval($Zmienna);
  6. if(is_int($Zmienna))
  7. {
  8. return $Zmienna;
  9. }
  10. else
  11. {
  12. return 0;
  13. }
  14. }
  15.  
  16. ?>


Zastosowanie:
  1. <?php
  2.  
  3. $Nazwisko = OczyscPost($_POST['Nazwisko'], 40);
  4. $ID = DoCyfry(OczyscPost($_GET['ID'], 10));
  5.  
  6. ?>


Jakieś uwagi?

Pozdrawiam,
K



Hmm.. Do czego jest właściwie to UNION? Może ktoś poda przykład? Bo ja się nie zetknąłem z takim zapytaniem
Go to the top of the page
+Quote Post
em1X
post
Post #92





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


A szukac to nie potrafisz?

  1. SELECT * FROM text UNION
  2. SELECT * FROM news


czyli sklejanie dwoch zapytan do bazy
Go to the top of the page
+Quote Post
Jarod
post
Post #93





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Próbując podsumować dyskusję, możnaby powiedzieć, że aby zabezpieczyć się przed SQL Injection trzeba filtrować każdą zmienną przychodzącą, czyli:

1. Jeśli spodziewamy się liczby to każdą zmienną traktujemy
  1. <?php
  2. intval($zmienna);
  3. ?>


2. Jeśli spodziewamy się ciągu to stosujemy
  1. <?php
  2. addslashes($zmienna);
  3. ?>


Czy to wystarczy?


A co w takim przypadku. Mamy spis użytkowników w systemie, który załóżmy że wygląda tak.

(IMG:http://sebo5.w.interia.pl/spis.jpg)

Przy każdym użytkowniku jest link z opcją usunięcia konta. Z tym linkiem, przesyłany jest numer ID danego klienta, żeby wiedzieć, którego klienta usunąć z bazy (ID jest kluczem głównym).

Teraz ktoś może zmodyfikować URL, np zamiast usunąć konto 2 (http://jakasstrona/usun.php&id=2) może wpisać dowolny inny numer, np (http://jakasstrona/usun.php&id=1) i skasuje konto admina.

Jak się przed tym zabezpieczyć?

Stosuję w każdym skrypcie funkcję weryfikującą, któa sprawdza czy użytkownik jest zalogowany i czy ma odpowiednie prawa. Ale wiem, że to nie wystarczy.

Ten post edytował J4r0d 30.05.2006, 07:24:43
Go to the top of the page
+Quote Post
Termit_
post
Post #94





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 11.06.2005
Skąd: Gostyń

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


Wówczas zawsze należy robić dodatkowe confirmy - formularze typu "Czy na pewno chcesz.... [ TAK ] [ NIE ]"
Go to the top of the page
+Quote Post
Jarod
post
Post #95





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(Termit_ @ 3.06.2006, 18:58 ) *
Wówczas zawsze należy robić dodatkowe confirmy - formularze typu "Czy na pewno chcesz.... [ TAK ] [ NIE ]"



Stosuję..
Go to the top of the page
+Quote Post
thornag
post
Post #96





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


Wedlug mnie mozesz jedynie sprawdzic czy Id nie jest elementem wyznaczonego przez Ciebie a niedozwolonego zbioru.

Zostaja jedynie confirmy, tutaj wszystko wydaje sie kwestia dostepu. Jesli dasz dostep do tego panelu, to po co meczyc sie ze zmiana URLa skoro wystarczy kliknac (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) No chyba ze kazdy uzytkownik ma inne prawa i innych uzytkownikow ktorych moze edytowac (taka relacja su/admin/sub-admin (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) wtedy wspommniany przezemnie zbior nalezalo by uzaleznic od uzytkowanika.
Go to the top of the page
+Quote Post
eai
post
Post #97





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


@J4r0d Bardzo prosto się można zabezpieczyć

Zastosuj sume kontrolną. jakasstrona/usun.php&id=2&checksum=f3sxSdf32vx3sGx

Napisz własny wzór generowania sumy kontrolnej oraz jej sprawdzania.
Np.

  1. <?php
  2.  
  3. function checksum ($id) {
  4.  
  5. return substr(md5('aXq23' . $id), 1, 3); 
  6.  
  7. }
  8.  
  9. if (checksum ($id) == $_GET['checksum']) {
  10.  // .... Usuwamy itp...
  11.  
  12.  }
  13. ?>


Ten post edytował eai 2.08.2006, 00:20:53
Go to the top of the page
+Quote Post
Turgon
post
Post #98





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


Zgadzam się z Eai. Ja stosuje sumy plus sesje oraz grupy uprawnień. Jeśli użytkownik nie ma odpowiedniego levela odrazu acces denied w głównym pliku administracyjnym. Nie pozwalam nawet dojść do uruchomienia reszty (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) .
Co do tego usuwania adminów to banał jest. Dodajemy do filtrowania requestów :
  1. <?php
  2. if($_GET['id'] == '1')
  3. {
  4. return false;
  5. }
  6. ?>


i gotowe (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Czyż nie trudne ?
Po za tym thornag używaj głównego pliku administracyjnego przez który jest jedyna możliwość użycia funkcji ACP etc. . To dodatkowe zabezpieczenie i trochę utrudnia życie, ale warto. Dodatkowa bariera dla włamywacza...
Go to the top of the page
+Quote Post
Jarod
post
Post #99





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(eai @ 1.08.2006, 23:19 ) *
@J4r0d Bardzo prosto się można zabezpieczyć

Zastosuj sume kontrolną. jakasstrona/usun.php&id=2&checksum=f3sxSdf32vx3sGx

Napisz własny wzór generowania sumy kontrolnej oraz jej sprawdzania.
Np.

  1. <?php
  2.  
  3. function checksum ($id) {
  4.  
  5. return substr(md5('aXq23' . $id), 1, 3); 
  6.  
  7. }
  8.  
  9. if (checksum ($id) == $_GET['checksum']) {
  10.  // .... Usuwamy itp...
  11.  
  12.  }
  13. ?>


Generujesz - ok. A w jaki sposób chcesz przetrzymywać tą sume i gdzie?
Go to the top of the page
+Quote Post
eai
post
Post #100





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

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


@J4r0d Przecież to jest jeszcze prostsze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Przykład:

checksum.php
  1. <?php
  2.  
  3. function checksum ($id) {
  4. return substr(md5('aXq23' . $id), 1, 3); 
  5. }
  6.  
  7. ?>


admin.php
  1. <?php
  2.  
  3. //...
  4.  
  5. include 'checksum.php';
  6.  
  7.  
  8. function foo () { //Jakas tam funkcja generujaca linki do panelu admina bla bla bla...
  9. $row = ...; //Tablica np. wynik z mysql
  10. echo 'strona.com?usun=' . $row['id'] . '&checksum=' . checksum($row['id'];
  11.  }
  12.  
  13.  
  14. function delete () {
  15. if(checksum ($_GET['id']) == $_GET['checksum']) {
  16.  
  17. // Usuwasz
  18.  
  19. }
  20. }
  21.  ?>


Prościej się wytłumaczyć nie da (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

22 Stron V   1 2 3 > » 
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 10:30