SQL Injection/Insertion, Jak zapobiec włamaniu na stronę. |
SQL Injection/Insertion, Jak zapobiec włamaniu na stronę. |
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....
Hasła mogą być takie same, ale różne loginy (sprawdzane przy rejestracji) jednoznacznie wskazują na dane konto. Ten post edytował Rzast 28.09.2006, 10:18:23 -------------------- Podhale naprawa komputerów, strony WWW
|
|
|
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]
|
|
|
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:
Czy wytłumaczyć dokładniej? pozdrawiam -------------------- Podhale naprawa komputerów, strony WWW
|
|
|
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ć? |
|
|
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ę ) , jedynie potwierdzenie od kogoś doświadczonego, czy addslashes() to 100% zabezpieczenie przed cudzysłowiami (nie 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 Swoją drogą, czy składnia typu
[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. |
|
|
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%) |
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) |
|
|
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ę 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? |
|
|
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ć.. Moim zdaniem, masz faktycznie paranoję 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. |
|
|
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
Ten post edytował L00zak 27.04.2007, 23:41:34 |
|
|
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 -------------------- |
|
|
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) |
|
|
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?
-------------------- |
|
|
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 |
|
|
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()
Dziękuję za przeczytanie i odpowiedź na te moje wypociny |
|
|
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:
A co do usuwania spacji to nie rozumiem problemu. Chodzi ci o to, że chcesz usunąć: ' ', ' ', '%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."
|
|
|
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). |
|
|
14.06.2007, 18:18:29
Post
#137
|
|
Grupa: Zarejestrowani Postów: 243 Pomógł: 32 Dołączył: 14.06.2007 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. Też mam (niestety) podobne odczucia... 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 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. 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 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 -------------------- |
|
|
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?
-------------------- |
|
|
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%) |
tylko po co te regexpy? Właśnie po co skoro istnieje filter_ input()" title="Zobacz w manualu PHP" target="_manual
|
|
|
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
|
|
|
Wersja Lo-Fi | Aktualny czas: 26.04.2024 - 21:41 |