Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

22 Stron V  « < 5 6 7 8 9 > »   
Reply to this topicStart new topic
> SQL Injection/Insertion, Jak zapobiec włamaniu na stronę.
Rzast
post 12.09.2006, 07:58:38
Post #121





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 24.11.2005
Skąd: Podczerwone

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


@MatheW: Właśnie chodziło mi o to, żeby nie dopuścić do bazy danych zawartości $_POST['login']. Bezpieczne jest zhaszowane hasło

Racja, nie wpisałem ostatniej modyfikacji....
  1. <?php
  2. $sql='SELECT id,login FROM baza WHERE haslo="'.md5($_POST['haslo']).'"';
  3. $wynik=mysql_query($sql);
  4. if (mysql_num_rows($wynik)>=1){
  5. $ok=true;
  6. while (($dana=mysql_fetch_row($wynik))&&($ok==true)){
  7. if ($dana[1]==$_POST['login'])){
  8. //Zalogowany
  9. $ok=false;
  10. $_Session['id']=$wynik[0];
  11. //Dalsze czynności....
  12. }
  13. }
  14. }else{
  15. //złe hasło
  16. }
  17. ?>

Hasła mogą być takie same, ale różne loginy (sprawdzane przy rejestracji) jednoznacznie wskazują na dane konto. Rkingsmiley.png

Ten post edytował Rzast 28.09.2006, 10:18:23


--------------------
Podhale naprawa komputerów, strony WWW
Go to the top of the page
+Quote Post
MatheW
post 26.09.2006, 16:37:19
Post #122





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 29.05.2006
Skąd: Lublin

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


Cytat
@MatheW: Właśnie chodziło mi o to, żeby nie dopuścić do bazy danych zawartości $_POST['login']. Bezpieczne jest zhaszowane hasłoRacja, nie wpisałem ostatniej modyfikacji....
To co zrobiłeś jest beznadziejne - pobierasz z bazy uzytkowników którzy mają takie same hasła! A takie same hasła moze miec paru userow. Wiec wynik moze zwrocic ich kilku - skad wiesz ktory to. W Twoim przpadku addslashes zupełnie wystarczy. Oczywiście przy rejestracji najlepiej zabron pewnych znakow w loginie, zeby nie sprawial trudnosci - najlepiej zostawic znaki alfanumeryczne, podkreslenia i spacje


--------------------
[gg:8166107][jid:mmatheww@jabberpl.org][mail:mat.wojcik[at]gmail.com][www: http://mwojcik.pl]
Go to the top of the page
+Quote Post
Rzast
post 28.09.2006, 10:24:12
Post #123





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 24.11.2005
Skąd: Podczerwone

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


MatheW: Przyjżałeś się? Ale tak naprawdę uważnie?
Piszesz:
Cytat
To co zrobiłeś jest beznadziejne - pobierasz z bazy uzytkowników którzy mają takie same hasła! A takie same hasła moze miec paru userow. Wiec wynik moze zwrocic ich kilku - skad wiesz ktory to.

a w kodzie jest:
  1. <?php
  2. if (mysql_num_rows($wynik)>=1){//jeżeli jest jakiś user (userzy) o takim haśle...
  3. $ok=true; //ustaw zmienną pomocniczą 
  4. while (($dana=mysql_fetch_row($wynik))&&($ok==true)){// dekoduj wynik z bazy dopóki pomocnicza prawdziwa
  5. if ($dana[1]==$_POST['login'])){ //jeżeli jest taki login to...
  6. //Zalogowany
  7. $ok=false; //skasuj pomocniczą
  8. $_Session['id']=$wynik[0]; //ustaw sesję
  9.  ...itd
  10. ?>

Czy wytłumaczyć dokładniej?
pozdrawiam


--------------------
Podhale naprawa komputerów, strony WWW
Go to the top of the page
+Quote Post
eai
post 29.09.2006, 09:26:34
Post #124





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

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


To jest bez sensu... a jeśli w bazie masz założymu 1 000 000 userów gdzie 10 000 na takie same hasło... Wtedy zalogowanie jednocześnie 1 000 userów, obciąży serwer. Po co tak robić?

Lepiej zrobić tak:
Login: [A-Za-Z0-9_-]
Hasło: tu już dowolnie i tak hasło trzymamy w bazie jako md5, wiec dodanie jakichkolwiek znaków ' " które mogłby by spowodować zmiane zapytania nic tu nie dadzą.

Po co sobie utrudniać życie i kombinować?
Go to the top of the page
+Quote Post
paziek
post 29.03.2007, 20:20:36
Post #125





Grupa: Zarejestrowani
Postów: 207
Pomógł: 25
Dołączył: 16.11.2006

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


Witam,

Czytam wątek już drugi raz (pierwszy raz ok. 3 miesiące temu, kiedy php to było dla mnie jeszcze nowość) i dalej nie jestem pewien co do sposobu zabezpieczenia.


Do tej pory używałem ctype_digit() do liczb, oraz htmlspecialchars() do reszty.
Ogólnie to wolałbym używać zamiast htmlspecialchars() funkcję addslashes(), ale kilka postów zamieszczonym na tym forum skutecznie zniechęciło mnie do niej. A mianowicie teksty typu: "A ja podwójnie robię addslashes", jakieś wyrażenia regularne, cuda nie widy..

Czy istnieje możliwość na 'obejście' addslashes()? Tzn przekazać do zmiennej nie wyeskejpowany cudzysłów (podwójny czy pojedyńczy) ?


ps. addslashes() dlatego, że zauważyłem iż MySQL wykonuje swego rodzaju stripslashes() na przychodzących danych, więc oszczędza to miejsce i nie trzeba dekodować później danych z wartości html'owych.


I o co chodzi z tym poruszeniem na temat UNION?
Przeczytałem artykuł http://www.really-fine.com/SQL_union.html i mniej więcej wiem na czym to polega..
Jeśli wyeskejpuje zmiennę lub sprawdze czy są liczbowe, to powinienem być bezpieczny przed tym, racja?



Nie potrzebuję alternatyw do wspomnianych funkcji (czytać manuala potrafię tongue.gif ) , jedynie potwierdzenie od kogoś doświadczonego, czy addslashes() to 100% zabezpieczenie przed cudzysłowiami (nie SQL Injection).
Oczywiście, post Nospora polecający używanie addslashes() przy zmiennych tekstowych daje mi 99% pewności, iż to tylko moja paranoja, ale ten 1% to o 1% za dużo niepewności smile.gif


Swoją drogą, czy składnia typu
  1. <?php
  2. "SELECT * FROM table WHERE cos = '".$_POST."'";
  3. ?>

[bez tych slashy..]
ma jakieś walory pod względem bezpieczeństwa? Używam ".$zmienna." tylko dlatego, że edytor mi wtedy ładnie koloruje taką składnie, ale kto wie, może to coś daje 'gratis'? Wydajność? Bezpieczeństwo?



Dzięki z góry za pomoc w tej sprawie,
Paziek.
Go to the top of the page
+Quote Post
Jarod
post 29.03.2007, 21:18:38
Post #126





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

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


Cytat(paziek @ 29.03.2007, 19:20:36 ) *
Czy istnieje możliwość na 'obejście' addslashes()? Tzn przekazać do zmiennej nie wyeskejpowany cudzysłów (podwójny czy pojedyńczy) ?

http://pl.php.net/manual/pl/function.mysql-escape-string.php


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
paziek
post 29.03.2007, 21:52:15
Post #127





Grupa: Zarejestrowani
Postów: 207
Pomógł: 25
Dołączył: 16.11.2006

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


Jarod: Dzięki ale nie dzięki ;o

Po pierwsze, cytujesz fragment postu i odpowiadasz na ten fragment (nawet jak by go wyjąć z kontekstu) czymś zupełnie innym :/ Zadatki na polityka tutaj widzę sadsmiley02.gif

Po drugie, tak jak napisałem, nie potrzebuje alternatywy do wspomnianych funkcji, ani gotowego rozwiązania na SQL Injection, koduje swoje aplikacje 'w miarę potrzeb' i potrafię posługiwać się manualem oraz goglami.
Przeczytałem już tyle artykułów oraz postów na forum, że wiem wystarczająco dużo na ten temat.



Chciałem się tylko dowiedzieć, czy istnieje jakiś bug, dziura, sposób, cokolwiek w funkcji addslashes(), który umożliwiłby wprowadzenie do zmiennej nie wyeskejpowanego cudzysłowia, bo nieco zwątpiłem w tą funkcję, zapewne nadinterpretacją kilku postów. To (prawie) wszystko.


Jakiś .. chakier się wypowie? snitch.gif
Go to the top of the page
+Quote Post
akubiczek
post 6.04.2007, 13:14:58
Post #128





Grupa: Zarejestrowani
Postów: 189
Pomógł: 0
Dołączył: 4.07.2004
Skąd: z neostrady

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


Tak, istnieje taki bug. Nazywa się on:

$slashedVar=str_replace('\"','"',addslashes($sourceVar));

Tylko to programista musiałby go popełnić.. smile.gif Moim zdaniem, masz faktycznie paranoję tongue.gif


I na koniec: Jarod dobrze ci napisał - do escepowania zmiennych, które umieszczasz w zapytaniu SQL służy mysql_real_escape_string().

I na drugi koniec: ani addslashes() ani htmlspecialchars() nie służą do tego, do czego próbujesz je użyć (patrz punkt wyżej). htmlspecialchars() stosujesz w momencie wyświetlania treści na stronie, aby zabezpieczyć się przed złośliwym działaniem właśnie na poziomie przeglądarki (HTMLa) a nie bazy.
Go to the top of the page
+Quote Post
L00zak
post 27.04.2007, 23:41:16
Post #129





Grupa: Zarejestrowani
Postów: 58
Pomógł: 5
Dołączył: 2.05.2006

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


php5, pdo i podpinanie, a skończą się wam problemy z addslashes(), mysql_real_escape_string() i magic_quotes tongue.gif

Ten post edytował L00zak 27.04.2007, 23:41:34
Go to the top of the page
+Quote Post
.radex
post 6.05.2007, 17:53:23
Post #130





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


Czy ktoś, kto się na tym zna może mi odpowiedzieć:

Jest tu wiele sprzecznych wypowiedzi

I czy "mysql_escape_string" w całkowicie wyklucza możliwość przeprowadzenia ataku SQL Injection, czy konieczne są jakieś modyfikacje zapytań (jak w pierwszym poście)? I proponuję administracji posprzątać temat, bo po przeczytaniu nic mi się kupy nie trzyma:P


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
Jarod
post 6.05.2007, 17:57:26
Post #131





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

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


Stosuję mysql_escape_string + filtrowanie danych i moim zdaniem jest to w zupełności bezpieczne.

A przy okazji jak filtrować na poziomie postgresql'a?

EDIT: @radex_p - bo nie znalazłem odpowiednika dla postgresql'a

Ten post edytował Jarod 6.05.2007, 19:20:47


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
.radex
post 6.05.2007, 19:15:35
Post #132





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


skoro mysql_escape_string (nie licząc standardowych procedur filtrujących) jest good, to czemu nie użyć podobnej funkcji przeznaczonej dla postgre'a, lub PHP'owskiej wbudowanej?


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
sobstel
post 7.05.2007, 00:05:09
Post #133





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

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


są sytuacje kiedy da się ją obejśc, nie jest tajemnicą że najlepiej stosować tzw. prepared statements. więcej: http://ilia.ws/archives/103-mysql_real_esc...Statements.html

Ten post edytował sopel 7.05.2007, 00:06:10


--------------------
"If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org
Go to the top of the page
+Quote Post
starach
post 12.05.2007, 17:08:15
Post #134





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Witam.
Przeczytałem ten temat dwa razy. Dwa razy dostałem oczopląsu i palpitacji serca.
Temat niby jeden, ale skaczecie od wątku do wątku. Oszaleć można.
Postaram się w skrócie podsumować poprzednie wypowiedzi, zanim przejdę do swojego pytania,
jako że poprzednie podsumowania ułatwiły mi czytanie tego wątku.

1. Należy sprawdzać czy liczba jest liczbą, to znaczy że jeśli przesyłamy urlem id rekordu z tabeli musimy sprawdzić czy jest on liczbą.
2. Dodawanie ukośników przez addslashes() lub mysql_real_escape_string() w zmiennych typu string.
(Z tekstu tutaj wyczytałem że mysql_real_escape_string() robi to lepiej. Czy tak jest i dlaczego ?)
3. Ostatnim problemem z SQL-Injection jakiego zdołałem się tutaj doczytać jest słowo kluczowe SQL 'UNION'
dzięki któremu można pobrać więcej danych.

W mojej opinii nie należy trząść portkami przed UNION jeśli zamiast gwiazdki po SELECT wypisuje się nazwy pól które chce się pobrać z tabeli. Jeśli się mylę poprawcie mnie.

Moje pytanie(oprócz tego w punkcie drugim):
Chciałbym się dowiedzieć jak mam usunąć ze zmiennej wszystkie spacje nie tylko te z przodu i z tyłu - trim()
Mam z tym problem bo spacje można zapisać jeszcze w inny sposób niż ' ' a ja niestety na tych metodach zapisu się nie znam.

Poniżej przedstawiłem swoją metodę dodającą do łańcucha znaków wsteczne ukośniki.
Prosiłbym o jakieś komentarze czy jest ona bezpieczna i czy zamiast addslashes powinienem zastosować mysql_real_escape_string()
  1. <?php
  2. public function sanitize($input, $force=false)
  3. {
  4. if(!get_magic_quotes_gpc() || $force == true)
  5. {
  6. if(is_array($input))
  7. {
  8. foreach($input as $key => $val)
  9. {
  10. $input[$key] = addslashes($val);
  11. }
  12. return $input;
  13. } else {
  14. return addslashes($input);
  15. }
  16. } else {
  17. return $input;
  18. }
  19. }
  20. ?>

Dziękuję za przeczytanie i odpowiedź na te moje wypociny winksmiley.jpg
Go to the top of the page
+Quote Post
Kicok
post 12.05.2007, 17:24:00
Post #135





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
Prosiłbym o jakieś komentarze czy jest ona bezpieczna

To zależy gdzie się jej użyje:
  1. <?php
  2.  
  3. // 1, zabezpieczone przed SQL injection
  4. $_GET['name'] = $this->sanitize( $_GET['name'] );
  5. mysql_query( "SELECT * FROM some_table WHERE name = '{$_GET['name']}'" );
  6.  
  7.  
  8. // 2, niezabezpieczone przed SQL injection
  9. $_GET['sort'] = $this->sanitize( $_GET['sort'] );
  10. mysql_query( "SELECT * FROM some_table ORDER BY {$_GET['sort']}" );
  11.  
  12. ?>



A co do usuwania spacji to nie rozumiem problemu. Chodzi ci o to, że chcesz usunąć: ' ', '&nbsp;', '%20', itp? Tylko po co, skoro 2 i 3 przykład sam z siebie w spację się nie zamieni...
No ale zawsze możesz użyć str_replace" title="Zobacz w manualu PHP" target="_manual

Ten post edytował Kicok 12.05.2007, 17:26:40


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
starach
post 12.05.2007, 17:36:48
Post #136





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Czyli nie ma się co zastanawiać tylko walnąć str_replace na ' '.
Ok dzięki.

Co do mysql_real_escape_string() to poniżej jest cytat z postu http://forum.php.pl/index.php?s=&showt...st&p=172835 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
SirZooro
post 14.06.2007, 18:18:29
Post #137





Grupa: Zarejestrowani
Postów: 243
Pomógł: 32
Dołączył: 14.06.2007

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


Cytat(orglee @ 12.05.2007, 17:08:15 ) *
Witam.
Przeczytałem ten temat dwa razy. Dwa razy dostałem oczopląsu i palpitacji serca.
Temat niby jeden, ale skaczecie od wątku do wątku. Oszaleć można.
Postaram się w skrócie podsumować poprzednie wypowiedzi, zanim przejdę do swojego pytania,
jako że poprzednie podsumowania ułatwiły mi czytanie tego wątku.

Też mam (niestety) podobne odczucia...

Cytat(orglee @ 12.05.2007, 17:08:15 ) *
1. Należy sprawdzać czy liczba jest liczbą, to znaczy że jeśli przesyłamy urlem id rekordu z tabeli musimy sprawdzić czy jest on liczbą.

Tak. Warto użyć do tego wyrażenia regularnego takiego jak to:
Kod
^[1-9][0-9]{0,8}$

Powyższe wyrażenie sprawdza jeszcze ilość cyfr - raczej mało kto będzie miał ponad miliard rekordów smile.gif

Cytat(orglee @ 12.05.2007, 17:08:15 ) *
2. Dodawanie ukośników przez addslashes() lub mysql_real_escape_string() w zmiennych typu string.
(Z tekstu tutaj wyczytałem że mysql_real_escape_string() robi to lepiej. Czy tak jest i dlaczego ?)

mysql_real_escape_string() uwzględnia zestaw znaków używany podczas łączenia się z bazą danych, więc będzie też poprawnie działać jeżeli używasz np. Unicode.

Co do ukośników - z tego co się orientuję, to kilka lat temu MySQL był wyjątkiem i ich wymagał, a inne bazy danych z którymi miałem do czynienia (PostgreSQL, MS SQL, Oracle) akceptowały podwójny apostrof (dwa apostrofy obok siebie). Obecnie także MySQL je akceptuję. Ja tutaj zalecam używanie mysql_escape_string() (dla MySQL) i pg_escape_string() (dla PostgreSQL), ew. podobnych funkcji (jest to opisane w dokumentacji PHP).

Przed wywołaniem tych funkcji warto także sprawdzić czy string wpisany do formularza nie jest za długi, i go obciąć. Warto także wywołać trim() - raczej nie ma sensu przechowywać dodatkowych spacji, które i tak nie będą wyświetlone.
Cytat(orglee @ 12.05.2007, 17:08:15 ) *
3. Ostatnim problemem z SQL-Injection jakiego zdołałem się tutaj doczytać jest słowo kluczowe SQL 'UNION'
dzięki któremu można pobrać więcej danych.

W mojej opinii nie należy trząść portkami przed UNION jeśli zamiast gwiazdki po SELECT wypisuje się nazwy pól które chce się pobrać z tabeli. Jeśli się mylę poprawcie mnie.

Przy UNION jest tylko ważne aby zgadzała się ilość kolumn i ich typy były zgodne, dlatego "SELECT *" przed niczym nie chroni. Dlatego np. takie zapytanie zadziała:
Kod
SELECT * FROM produkty WHERE id=0 UNION SELECT login, haslo, 0, 0, 0 FROM uzytkownicy


Cytat(orglee @ 12.05.2007, 17:08:15 ) *
Moje pytanie(oprócz tego w punkcie drugim):
Chciałbym się dowiedzieć jak mam usunąć ze zmiennej wszystkie spacje nie tylko te z przodu i z tyłu - trim()
Mam z tym problem bo spacje można zapisać jeszcze w inny sposób niż ' ' a ja niestety na tych metodach zapisu się nie znam.

Użyj czegoś takiego:
Kod
echo preg_replace('/\s+/', ' ', ' a   b   c  ');

To polecenie zamienia kilka spacji (i innych "białych" znaków) na jedną spację. Nie usuwa ono jednak całkowicie spacji z początku i końca - trzeba albo to wyrażenie poprawić, albo dodatkowo użyć trim(). Jeżeli chcesz natomiast wyciąć wszystkie spacje, usuń spację z drugiego parametru.

Ktoś wcześniej wspomniał też o mod_rewrite i .htaccess - można tego użyć jako dodatkowego mechanizmu zabezpieczeń, trzeba tylko pilnować aby nigdzie na stronach nie pojawił się rzeczywisty adres stron w serwisie. Poza tym warto także pamiętać że zawsze można próbować zgadnąć nazwy stron i nazwy parametrów.

Poza tym jest jeszcze kwestia znaku komentarza "--" w SQL, i tzw. ataki wielofazowe, ale o tym nie chce mi się drugi raz pisać - zerknijcie sobie tutaj: Ataki SQL Injection smile.gif


--------------------
Go to the top of the page
+Quote Post
bełdzio
post 15.06.2007, 16:54:59
Post #138





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


tylko po co te regexpy?


--------------------
Go to the top of the page
+Quote Post
starach
post 15.06.2007, 18:33:41
Post #139





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Cytat(bełdzio @ 15.06.2007, 17:54:59 ) *
tylko po co te regexpy?
Właśnie po co skoro istnieje filter_ input()" title="Zobacz w manualu PHP" target="_manual
Go to the top of the page
+Quote Post
Nightmare
post 16.06.2007, 11:45:53
Post #140





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 21.05.2007

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


Po to żeby ci z php4 też mieli bezpieczne formularze winksmiley.jpg
Go to the top of the page
+Quote Post

22 Stron V  « < 5 6 7 8 9 > » 
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 Wersja Lo-Fi Aktualny czas: 26.04.2024 - 21:41