SQL Injection/Insertion, Jak zapobiec włamaniu na stronę. |
SQL Injection/Insertion, Jak zapobiec włamaniu na stronę. |
30.01.2011, 14:54:43
Post
#341
|
|
Grupa: Zarejestrowani Postów: 330 Pomógł: 0 Dołączył: 25.01.2008 Ostrzeżenie: (0%) |
to wyjątkowa sytuacja, nie mam zamiaru robić forum dla programistów.
--------- Mam dodakotwe pytanie. Jesli w skrypcie inkluduje sobie plik na z nazwy GETA. Aby zabezpieczyć się przed tym, żeby ktos nie piwsał nap ?p=../../config.php robię taki warunek "if(eregi ('\.', $_GET['p'])) die(); czy są jakieś metody, które obejdą mój warunek? Ten post edytował propage 30.01.2011, 16:14:42 |
|
|
30.01.2011, 21:45:29
Post
#342
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) |
to wyjątkowa sytuacja, nie mam zamiaru robić forum dla programistów. --------- Mam dodakotwe pytanie. Jesli w skrypcie inkluduje sobie plik na z nazwy GETA. Aby zabezpieczyć się przed tym, żeby ktos nie piwsał nap ?p=../../config.php robię taki warunek "if(eregi ('\.', $_GET['p'])) die(); czy są jakieś metody, które obejdą mój warunek? yyy tak. I to co najmniej kilka metod. -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
30.01.2011, 21:56:07
Post
#343
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) |
Cytat to wyjątkowa sytuacja, nie mam zamiaru robić forum dla programistów. To nie ma znaczenia.W ogóle zabierasz się za to od złej strony. Próbujesz nie dopuścić do wprowadzenia "dziwnych" danych (co jest bardzo trudne) zamiast upewnić się, że dane zostaną odpowiednio obsłużone (co jest bardzo proste). Dane trafiają do XML-a czy formatu pochodnego jak HTML? htmlentities czy któraś z podobnych funkcji - problem z głowy. Dane trafiają do URL-a? (raw)urlencode - problem z głowy. Dane trafiają do JSON-a? json_encode - problem z głowy. itd. Cytat Mam dodakotwe pytanie. 1. Nie używaj ereg.Jesli w skrypcie inkluduje sobie plik na z nazwy GETA. Aby zabezpieczyć się przed tym, żeby ktos nie piwsał nap ?p=../../config.php robię taki warunek "if(eregi ('\.', $_GET['p'])) die(); czy są jakieś metody, które obejdą mój warunek? 2. Po prostu określ jakie wartości może przyjąć. Ile masz tych plików? 5, 10, 15? |
|
|
31.01.2011, 08:43:00
Post
#344
|
|
Grupa: Zarejestrowani Postów: 330 Pomógł: 0 Dołączył: 25.01.2008 Ostrzeżenie: (0%) |
To nie ma znaczenia. W ogóle zabierasz się za to od złej strony. Próbujesz nie dopuścić do wprowadzenia "dziwnych" danych (co jest bardzo trudne) zamiast upewnić się, że dane zostaną odpowiednio obsłużone (co jest bardzo proste). Dane trafiają do XML-a czy formatu pochodnego jak HTML? htmlentities czy któraś z podobnych funkcji - problem z głowy. Dane trafiają do URL-a? (raw)urlencode - problem z głowy. Dane trafiają do JSON-a? json_encode - problem z głowy. itd. 1. Nie używaj ereg. 2. Po prostu określ jakie wartości może przyjąć. Ile masz tych plików? 5, 10, 15? Mam wiele plików, to musi być bardziej elastyczne. Nie chce wypisywać w skrypcie nazw wszystkich możliwych plików. Skoro są takie metody to chciałbym je poznać, aby się zabezpieczyć przed nimi. |
|
|
31.01.2011, 19:40:07
Post
#345
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) |
W tym przypadku wystarczy (zakładając, że wszystkie pliki do includowania posiadasz w jednym, oddzielnym katalogu [np. `includes/`]):
-------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
1.02.2011, 12:21:29
Post
#346
|
|
Grupa: Zarejestrowani Postów: 330 Pomógł: 0 Dołączył: 25.01.2008 Ostrzeżenie: (0%) |
pyro, przed czym ma zabezpieczyć ten kod?
jesli inc bedzie mieć zawierać "../../index.php" to if(!include_once('includes/'.$inc)) da nam to if(!include_once('includes/../../index.php')) plik taki istnieje. |
|
|
1.02.2011, 12:26:23
Post
#347
|
|
Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 |
@propage aleś ty cwany... wyciąłeś kawałek z kodu pyro i masz do niego jakieś żale :/
Z kodu pyro wywaliłeś: $inc = basename($_GET['inc']); a ten właśnie kawałek kodu stanowił podstawę zabezpieczenia -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
1.02.2011, 12:49:00
Post
#348
|
|
Grupa: Zarejestrowani Postów: 330 Pomógł: 0 Dołączył: 25.01.2008 Ostrzeżenie: (0%) |
nie zauważyłem tej funkcji, to jest wystarczające zabezpieczanie?
|
|
|
1.02.2011, 12:53:35
Post
#349
|
|
Grupa: Moderatorzy Postów: 36 457 Pomógł: 6297 Dołączył: 27.12.2004 |
Cytat nie zauważyłem tej funkcji, Kod miał 4 linijki :/
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
28.07.2011, 19:29:43
Post
#350
|
|
Grupa: Zarejestrowani Postów: 106 Pomógł: 0 Dołączył: 11.03.2007 Skąd: Łódzkie Ostrzeżenie: (0%) |
chciałbym sie dowiedzieć jakie jest/są w "miarę" skuteczne zabezpieczenie/a przed tym atakiem
szukalem na tym forum... i co któryś post przekierowujecie do tego.. . poczytałem kilka stron tego tematu.. i jednym słowem tu jest wielka sieczka: kazdy sie "przekrzykuje" tak jak tirowcy stojący w korku przekrzykują osobówki mijające ich bokiem.. skoro temat jest tematem tak ważnym może "moderacja" by podsumowała go i napisała w pierwszym poście na co tak naprawdę trzeba zwrócić uwagę.. Ten post edytował japolak 28.07.2011, 19:31:11 -------------------- moje projekty:
www.hackwars.pl - hacking , webdesign itp www.kosmosnews.pl - Wszechświat bez granic |
|
|
28.07.2011, 19:41:14
Post
#351
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 25 Dołączył: 27.01.2007 Ostrzeżenie: (0%) |
chciałbym sie dowiedzieć jakie jest/są w "miarę" skuteczne zabezpieczenie/a przed tym atakiem szukalem na tym forum... i co któryś post przekierowujecie do tego.. . poczytałem kilka stron tego tematu.. i jednym słowem tu jest wielka sieczka: kazdy sie "przekrzykuje" tak jak tirowcy stojący w korku przekrzykują osobówki mijające ich bokiem.. rozwiązując dany problem mamy mnóstwo rozwiązań i w zależności od problemu stosujemy odpowiednie ku temu rozwiązanie - jeden napisze swój algorytm, ktoś inny usiądzie nad tym samym problemem i wypluje zupełnie inny kod. zmierzam więc do tego, że nie ma "złotego" rozwiązania, inaczej dawno temu ktoś napisałby program, który zastąpiłby programistów i pisał programy za nich |
|
|
8.08.2011, 14:10:14
Post
#352
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) |
chciałbym sie dowiedzieć jakie jest/są w "miarę" skuteczne zabezpieczenie/a przed tym atakiem szukalem na tym forum... i co któryś post przekierowujecie do tego.. . poczytałem kilka stron tego tematu.. i jednym słowem tu jest wielka sieczka: kazdy sie "przekrzykuje" tak jak tirowcy stojący w korku przekrzykują osobówki mijające ich bokiem.. skoro temat jest tematem tak ważnym może "moderacja" by podsumowała go i napisała w pierwszym poście na co tak naprawdę trzeba zwrócić uwagę.. Zobacz na phpmagazyn.pl -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
10.08.2011, 16:08:26
Post
#353
|
|
Grupa: Zarejestrowani Postów: 278 Pomógł: 35 Dołączył: 25.06.2010 Ostrzeżenie: (0%) |
Nie znalazłem w temacie, więc pozwolę sobie dodać przykładowe użycie PDO.
Prosty skrypt, więc myślę że pozwoli zrozumieć o co w tym chodzi, osobie która zaczyna z nim zabawę:
|
|
|
11.08.2011, 17:18:05
Post
#354
|
|
Grupa: Zarejestrowani Postów: 61 Pomógł: 4 Dołączył: 18.09.2010 Ostrzeżenie: (0%) |
Byłby ktoś tak miły, żeby streścić cały ten temat do jednego posta wybierając najlepsze i najskuteczniejsze metody, przy okazji usuwając posty wprowadzające w błąd?
Z góry dzięki -------------------- eXtreme-Fusion CMS - polski, darmowy system zarządzania treścią z rozbudowanym wsparciem technicznym.
|
|
|
12.08.2011, 09:05:51
Post
#355
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) |
@Inscure
W celu zabezpieczenia się przed atakami SQL Injection używa się prepared statements. Wszystkie powyższe posty które mówią co innego wprowadzają w błąd. Bardziej streścić się chyba nie da -------------------- |
|
|
12.08.2011, 11:29:37
Post
#356
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) |
A pro po tematu znalazłem dziś na dzone.com
http://php.dzone.com/news/hardening-php-sql-injection -------------------- I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy. QueryBuilder, Mootools.net, bbcradio1::MistaJam http://www.phpbench.com/ |
|
|
12.08.2011, 13:06:45
Post
#357
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
@Noidea: nie spłycaj tak, bo nie masz do końca racji. Zabezpieczanie przed sql injection jest zazwyczaj kilkupoziomowe i powiedzenie "używaj prepared statements a bedzie cacy" jest po prostu ignorancją. Ono zabezpiecza, ale nie wszędzie jest możliwe do zastosowania to raz, a dwa, że prawidłowe zabezpieczenia działają jeszcze zanim cokolwiek do bazy zaczniesz wrzucać i obejmują filtrowanie danych oraz ich walidację.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
12.08.2011, 14:51:22
Post
#358
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) |
PDO jest dostępne w PHP gdzieś od wersji 5.1. MySQLi chyba jeszcze dłużej. Sterowniki do mniej popularnych baz również mają obsługę prepared statements. Myślę, że już najwyższy czas, żeby społeczność zakończyła wsparcie dla staroci pokroju 4.x. Ewentualnie można napisać
Cytat Aby zabezpieczyć się przed SQL Injection używaj prepared statements opis... opis... opis... gdzieś na dole, małymi literami: Jeśli na twoim hostingu nie ma obsługi prepared statements dla twojej bazy danych to a) zmień hosting LUB poczytaj innych sposobach zabezpieczania [link] Takie coś przynajmniej nie będzie mącić w głowie początkującym, którzy wielopoziomowe zabezpieczenie przed SQL Injection rozumieją tak: Cytat a dwa, że prawidłowe zabezpieczenia działają jeszcze zanim cokolwiek do bazy zaczniesz wrzucać i obejmują filtrowanie danych oraz ich walidację. Przed SQL Injection zabezpieczają prepared statements. Filtrowanie i walidacja zabezpiecza przed tym, żeby użytkownik nie ustawił sobie wieku -12345 lat, nazwiska zawierającego cyfry, czy adresu email bez małpy. To, że niektóre rygorystyczne filtry (np. login mogący składać się wyłącznie z liter i cyfr) zabezpiecza przed SQL Injection to tylko efekt uboczny. Dlatego uważam, że sposoby poprawnej walidacji danych powinny być przedstawione w podczepionym temacie o walidacji danych. -------------------- |
|
|
12.08.2011, 20:15:26
Post
#359
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
Noidea... A ja napiszę, że zamiast prepared statements można użyć procedur składowanych i też będę miał rację. To na co chciałem zwrócić uwagę to fakt, że wspomniane przez Ciebie rozwiązanie nie jest jedyne i niepodważalne to raz, a dwa, że nie jest problemem napisać nowy serwis od zera i zastosować każdy myk jaki się zna. Programista wielokrotnie musi grzebać w czyimś kodzie, który "pierwszej świeżości" być nie musi i konieczność jego bezpiecznego utrzymania także jest ważna, mimo wprowadzania swoich poprawek. Możesz przemycać własne sztuczki, ale możesz dostać serwis, gdzie jesteś zmuszony zapomnieć o mechanizmach ochrony Ci znanych bo próba pisania w php5 = przepisanie całego core i masy elementów zależnych, czyli w zasadzie napisania serwisu od zera. Pół biedy gdy serwis wspiera kilka wersji i sobie po stronie serwera ustawisz które pliki idą jako php4, a jakie przez php5, ale i tak będzie to bagno z wydzielonymi funkcjonalnościami i gdzieś w końcu umoczysz zapewne bezpieczeństwo przez przypadek choćby. Wtedy tylko konkretna walidacja Cię może jakoś poratować, ale nie zabezpieczy i tak, bo część przydatnych funkcji jest dopiero od php5 i masz potencjalnie przydatne funkcje odcięte od arsenału. Witamy w prawdziwym świecie, a nie jego wycinku. I nie zapomnij o kompatybilności kodu wstecz. Naprawdę fajnie się pisze "rób tak i tak, olej resztę rozwiązań", tyle że jest to najczęściej prosta droga do tego by pokpić sprawę i puścić na produkcję bubel. Pamiętaj, że Twój komp to nie jedyna konfiguracja dla serwerów, a ja już wystarczająco wiele widziałem ustawień w php.ini, które powodowały, że zgrzytałem zębami. Nie wspominam nawet o aplikacjach firm trzecich, które zakładają sobie hostingodawcy i które mają w zamyśle chronić serwery, a wyjątkowo często sprawiają masę problemów. Sam niedawno kląłem na czym świat stoi, gdy się okazało, że hostingodawca filtruje dane $_POST i $_GET przez co 90% akcji administratorskich kończyło się errorem 403. A potem szukaj wiatru w polu bo kod poprawny się sypie, choć na developerskim śmigał jak marzenie. Powiesz klientowi, że ma sobie serwer zmienić lub doinstalować jakiś pakiet czy skompilować z obsługą określonego bo Twój konfig to ma i użyłeś przy pisaniu serwisu? Nie sądzę.
A to co mówiłem o wieloetapowości ochrony to jest ważna rzecz. Po co zezwalać na zapis do bazy głupot, skoro można i powinno się je odsiać już wcześniej. Należy nie tylko kontrolować co wchodzi ale i wychodzi z bazy. Większość osób zwraca tylko na to pierwsze uwagę, ignorując choćby pobieżne sprawdzenie danych otrzymanych -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
13.08.2011, 08:25:34
Post
#360
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) |
Sparametryzowane wywołanie procedur składowanych zabezpiecza przed SQL Injection. Ale jeśli będziemy to wywołanie sklejali ze stringów, to może nam to nic nie dać. O ile w przypadku MySQL ciężko będzie to wykorzystać, bo mysql_query nie zezwala na więcej niż jedną instrukcję, to dla innych baz już takiego ograniczenia nie ma:
Chodzi mi o to, że najwyższy już czas przedstawiać użytkownikom nowoczesne rozwiązania problemów. Funkcje mysql_* siedzą w pehapie już od przeszło dziesięciu lat. Doczekały się następców, nieobarczonych charakterystycznymi dla nich problemami (ręczne zabezpieczanie przed sql injection, błędy zamiast wyjątków, itd.). Ale pomimo to są w 90% przypadków przedstawiane jako podstawowe rozwiązanie problemu wykorzystania baz danych w php. Co ciekawe gdy ludzie zadają na stackoverflow pytania odnośnie C#, nie dostają odpowiedzi z stylu "hmm... nie podałeś wersji .NET pod którą piszesz, więc na wszelki wypadek podam ci rozwiązanie dla .NET 1.1 z 2001 roku". Nie, zamiast tego piszą "W .NET 4.0 możesz bardzo łatwo zrobić to przy użyciu XXX oraz YYY (...)". Dzięki temu wiesz jak rozwiązać problem, lub szukasz odpowiedników XXX i YYY dla starszej wersji .NET. Więc zgadzam się ze wszystkim o czym mówisz, oprócz: Cytat Programista wielokrotnie musi grzebać w czyimś kodzie, który "pierwszej świeżości" być nie musi Otóż świeży kod, datowany na 2011 rok, również jest pisany przy użyciu mysql_* i zabezpieczany ręcznie przy użyciu mysql_real_escape_string, co nie zawsze się młodym programistom udaje, przykład:
Dlatego ja nadal obstaję przy swoim i uważam, że aby pisać kod zabezpieczony przed SQL Injection, należy korzystać z prepared statements. A gdy już na prawdę nie ma innej możliwości, to wtedy czytamy o addslashes, magic_quotes, mysql_real_escape_string, rzutowaniu na typy liczbowe, itd. Może dzięki temu kilku początkujących zacznie pisać swoje pierwsze zapytania od razu w PDO. -------------------- |
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 08:14 |