![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 21.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
Kiedyś napisałem prosty CRM który działał ale był skrajnie niebezpieczny, tzn nie ma żadnego filtrowania danych przesyłanych z formularzy ani też tych zapisywanych w bazie.
Teraz zająłem się właśnie kwestią bezpieczeństwa aby mój twór stał się w końcu przydatny. Na pierwszy ogień poszła kwestia panelu logowania i tu pytanie: czy sprawdzenia hasła i loginu jak poniżej jest Waszym zdaniem wystarczająco bezpieczne:
Zakładam że loginem jest adres e-mail a hasło nie może zawierać znaków \ / ' ` " \n \s |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Nie jest w ogóle bezpieczne. W linii 5 i 7 masz błędy typu SQL injection. Dodatkowo zapytanie w linii 9 jest zupełnie niepotrzebne, bo przecież te dane już raz dostałeś w linii 7.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 21.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
Czy teraz jest ok?
Wkleiłem tylko część odpowiedzialną za przetwarzanie danych. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 332 Pomógł: 22 Dołączył: 6.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Nie http://pl.wikipedia.org/wiki/SQL_injection Cytat redeemer podał rozwiązanie lepiej PDO Ten post edytował ber32 15.09.2013, 16:37:13 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 21.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
Ale czy rzeczywiście tej kod jest ciągle podatny na SQL_injection. Przecież wyrażenia regularne eliminują możliwość przedostania się do zapytania niebezpiecznych znaków.
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 332 Pomógł: 22 Dołączył: 6.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 12 Dołączył: 20.12.2009 Skąd: Siedlce Ostrzeżenie: (0%) ![]() ![]() |
Nie wystarczy przypadkiem stare, dobre htmlspecialchars() i addslashes()
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 21.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
Zupełnie nie rozumiem dlaczego mam analizować akurat te trzy podane przez Ciebie linie kodu wyjęte z kontekstu.
Wydaje mi się że jeśli string pobrany z formularza nie odpowiada wyrażeniu regularnemu to zostanie wykonany tylko header i nic więcej, a zmiennej $clean['login'] zostanie przypisana wartość zmiennej trim($_POST['login']) tylko jeśli login jest zgodny ze schematem. Czy się mylę i dlaczego? Ten post edytował Doody 15.09.2013, 17:28:45 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 332 Pomógł: 22 Dołączył: 6.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Sryy
Cytat SQL Injection (z ang., dosłownie zastrzyk SQL) – luka w zabezpieczeniach aplikacji internetowych polegająca na nieodpowiednim filtrowaniu lub niedostatecznym typowaniu i późniejszym wykonaniu danych przesyłanych w postaci zapytań SQL do bazy danych. Podatne są na niego systemy złożone z warstwy programistycznej (przykładowo skrypt w PHP, ASP, JSP itp.) dynamicznie generującej zapytania do bazy danych (MySQL, PostgreSQL itp.). Wynika on zwykle z braku doświadczenia lub wyobraźni programisty.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 21.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
Jestem początkujący ale co oznacza SQL Injection wiem.
Rozumiem że skoro się wypowiadasz, to jesteś bardziej zaawansowany. Jeśli możesz wskaż po prostu proszę gdzie jest ta luka, bo jestem za głupi żeby zrozumieć twoje zdawkowe odpowiedzi. Cytowanie mi def. SQL Injection nic nie wnosi do tematu. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
W liniach 5,7,9 masz kod podany na SQLi, z resztą już koledzy wyżej powiedzieli.
Twoje filtrowanie ograniczyło się do trim(), czyli o dużo za mało.4
Będzie bezpieczniej. Najlepiej zastosuj PDO BindValue() |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 516 Pomógł: 63 Dołączył: 27.08.2012 Ostrzeżenie: (0%) ![]() ![]() |
Musisz się jeszcze dużo uczyć
Po pierwsze : if(isset($_POST['login']) || isset($_POST['haslo'])) -- wystarczy sprawdzić czy istnieje submit session_start(); -- dałeś dopiero po warunku , dlaczego ? Później powstają tematy, że sesja nie działa na wszystkich stronach. Otwieraj sesje najlepiej na początku dokumentu. Wiem, ze to logowanie i po logowaniu ta strona nie bedzie dostepna, ale moze robisz ten sam błąd w innych dokumentach $zapytanie = "SELECT * FROM biz_user WHERE p_login = '".trim($_POST['login'])."'"; -- napisałeś, że znasz się na atakach typu sql. Nie znasz sie ani troche. Przestudiuj dokładnie o co z nimi chodzi a zobaczysz jak powazną luke masz w tym miejscu. Funckja trim przed niczym Cię tutaj nie chroni. jeśli jesteś początkujący, to jeśli piszesz sprawdzenie jakiegoś formularza to zacznij najpierw od zdefiniowania zmiennych, np: $login = mysql_escape_string($_POST['login']); $haslo = "$_POST['haslo']; Jeśli nie uzywasz PDO, to przeflitruj dodatkowo login przez wyrażenie regularne - to chyba najpewniejszy sposób. Dopiero po sprawdzeniu zmiennych tworzysz warunek, gdzie jesli obie te zmienne sa ok , to dopiero pobierasz dane z bazy (IMG:style_emoticons/default/exclamation.gif) ! Hasła nie musisz sprawdzać. Każdy powinien miec takie hasło jakie chce. Z bazy danych sprawdzac tylko czy jest taki login w bazie i pobierasz jego hasło. Jeśli hasło zgadza sie z tym podanym z formularza, to tworzysz sesje Ten post edytował gitbejbe 16.09.2013, 09:51:07 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 21.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
Musisz się jeszcze dużo uczyć To nie podlega dyskusji. Po pierwsze : if(isset($_POST['login']) || isset($_POST['haslo'])) -- wystarczy sprawdzić czy istnieje submit Tak też zrobię. session_start(); -- dałeś dopiero po warunku , dlaczego ? Później powstają tematy, że sesja nie działa na wszystkich stronach. Otwieraj sesje najlepiej na początku dokumentu. Wiem, ze to logowanie i po logowaniu ta strona nie bedzie dostepna, ale moze robisz ten sam błąd w innych dokumentach W pozostałych plikach mam start sesji na początku. dokładnie wygląda to tak:
$zapytanie = "SELECT * FROM biz_user WHERE p_login = '".trim($_POST['login'])."'"; -- napisałeś, że znasz się na atakach typu sql. Nie znasz sie ani troche. Przestudiuj dokładnie o co z nimi chodzi a zobaczysz jak powazną luke masz w tym miejscu. Funckja trim przed niczym Cię tutaj nie chroni. jeśli jesteś początkujący, to jeśli piszesz sprawdzenie jakiegoś formularza to zacznij najpierw od zdefiniowania zmiennych, np: $login = mysql_escape_string($_POST['login']); $haslo = "$_POST['haslo']; Jeśli nie uzywasz PDO, to przeflitruj dodatkowo login przez wyrażenie regularne - to chyba najpewniejszy sposób. Dopiero po sprawdzeniu zmiennych tworzysz warunek, gdzie jesli obie te zmienne sa ok , to dopiero pobierasz dane z bazy (IMG:style_emoticons/default/exclamation.gif) ! Nie napisałem że znam się na atakach typu sql. Napisałem że wiem co to jest atak typu SQL Injection, to spora różnica. Natomiast jeśli spojrzysz na mój drugi post, zauważysz że właśnie tak zrobiłem. Login jest przefiltrowany przez wyrażenie regularne, a dopiero później zmienna $clear['login'] umieszczona w zapytaniu do bazy. Hasła nie musisz sprawdzać. Każdy powinien miec takie hasło jakie chce. Z bazy danych sprawdzac tylko czy jest taki login w bazie i pobierasz jego hasło. Jeśli hasło zgadza sie z tym podanym z formularza, to tworzysz sesje Dzięki - rzeczywiście wystarczy porównać. Ten post edytował Doody 17.09.2013, 16:05:12 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 19:07 |