Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PHP][MYSQL] zabezpiecznie logowania przed atakami MySql

20 Lis 2011 14:18 3432 24
  • Poziom 13  
    Witam,

    jako początkujący czytam o atakach SQL injection.

    Chciał bym w swoim logowaniu zastosować
  • Poziom 40  
    A na czym polega problem? Bo funkcja wygląda dobrze, tutaj w Example 2 masz podobny przykład, tyle że dla wielu wierszy.
  • Poziom 13  
    no właśnie wygląda ok ale po wywołaniu logowania wyskakuje mi

    Notice: Undefined variable: userpass in D:\Inne\wamp\www\panel_x\log\logowanie.php

    błędy w linijkach:

    Kod: php
    Zaloguj się, aby zobaczyć kod


    Robie właśnie to na podstawie manuala php,
    nie wiem co to jest
    Cytat:
    Kod: php
    Zaloguj się, aby zobaczyć kod
  • Poziom 42  
    No a skąd mają się te dwie zmienne pojawić? W podanym kodzie nic takiego nie ma.

    A tak swoją drogą - ludzie, odchodźcie od mysql na rzecz mysqli! Tam użycie parametrów w spreparowanym zapytaniu tworzy zupełnie bezpieczne zapytanie bez jakichkolwiek funkcji konwersji znaków.
  • Pomocny post
    Poziom 40  
    A przypisałeś wcześniej coś do tych zmiennych? (pytanie retoryczne... ;))
    Jeśli nie, przed swoją funkcją wstaw:

    Kod: php
    Zaloguj się, aby zobaczyć kod

    lub, jeśli wolisz na if'ach:
    Kod: php
    Zaloguj się, aby zobaczyć kod


    Dla tej drugiej zmiennej tak samo.

    ad.2. %s powoduje wpisanie w to miejsce wartości typu string, która jest podana jako kolejny parametr funkcji sprintf.


    Swoją drogą dwie rady:
    1. Jak już zalogujesz użytkownika poprawnie, nie ma potrzeby trzymania w tablicy sesji jego hasła ($_SESSION['userpass']). Nazwa użytkownika powiedzmy że może się do czegoś przydać, ale trzymanie hasła to tylko luka w bezpieczeństwie, których jak widzę chcesz unikać. Raczej trzymaj jakąś zmienną typu $_SESSION['zalogowany'] = true;. Nie zapomnij o opcji wylogowania się użytkownika: wyczyść wtedy tablicę sesji: unset($_SESSION['zalogowany']) etc. zanim przejdziesz np. ponownie na stronę główną.

    2. Często stosowanym rozwiązaniem na podwyższenie bezpieczeństwa jest kodowanie hasła użytkownika algorytmem md5. Praktycznie ogranicza się do zmodyfikowania hasła na:
    Kod: php
    Zaloguj się, aby zobaczyć kod

    Oczywiście funkcji md5() musisz też użyć w momencie wpisywania hasła do bazy w poleceniu INSERT INTO... - wtedy w bazie danych hasło będzie przechowywane w nieczytelnej postaci, którą będzie trudniej odszyfrować, gdyby ktoś uzyskał do niej dostęp.
  • Poziom 13  
    Dzięki za sensowna odpowiedź do Twoich rad zaraz się odniosę, wracając do problemu przypisałem do zmiennych tak jak mówisz, błędów nie ma, ale nie mogę się zalogować, tak jak by błędne dane logowania. W bazie miałem hasło szyfrowane w taki sposób
    Kod: php
    Zaloguj się, aby zobaczyć kod
    więc myślałem, że to to...edytowałem ręcznie na zwykłe i nic...swoją drogą czym to się różni od md5?
  • Poziom 40  
    Rozumiem że to część kodu, bo się tak dziwnie urywa??

    O ile wiem w PHPie nie ma takiej funkcji password(), to musi być jakaś funkcja którą ktoś sobie napisał (rozumiem że przerabiasz jakiś program / używasz gotowych fragmentów kodu?). Z kolei md5() to funkcja domyślnie "wbudowana" w php. Poczytaj o niej w Biblii wszystkich PHPowców.
    I żeby nie było - nie jest to jakaś super bezpieczna funkcja, podatna na metodę brute-force, są strony ze złamanymi już popularnymi hasłami, za to umożliwia ona szybkie zaszyfrowanie hasła w jedną stronę i lepsze to niż żadne szyfrowanie.

    Spróbuj najpierw bez szyfrowania, wprowadź sobie do bazy testowego użytkownika i hasło prostym tekstem i doprowadź do momentu aż się zalogujesz (w takiej formie jak masz powyżej powinno to działać).

    Jak patrzysz do bazy to hasło masz zaszyfrowana czy zwykłym tekstem zapisane?
  • Poziom 13  
    password() jest bo do tej pory używałem i działało ;]
    w bazie mam takie hasło i takie
  • Poziom 40  
    Na pewno nie jest to funkcja PHPa. Ale skoro używasz i działa, a hasło w bazie jest nią zakodowane, to trzeba ją zastosować i w zapytaniu. Spróbuj takiej modyfikacji:
    Kod: php
    Zaloguj się, aby zobaczyć kod
  • Poziom 13  
    Na nie kodowanym haśle też nie działa, więc to nie w tym problem. Myślę dalej nad tym.
  • Poziom 40  
    Nie jestem pewien, ale możliwe że te dwie linijki:
    Kod: php
    Zaloguj się, aby zobaczyć kod

    się gryzą: możliwe, że jak wykonasz mysql_fetch_array na zmiennej $result, to potem funkcja mysql_num_rows($result) nie zwraca 1 (swoją drogą: co zwraca jak wyświetlić jej wynik?), ale trzeba by to sprawdzić... Tutaj w pkt. 3 jest kod bardzo do Twojego podobny, spróbuj się nim podeprzeć.
  • Poziom 13  
    login: test hasło: test
  • Pomocny post
    Poziom 40  
    W login.php po username w $_POST['username '] oraz odpowiednio po userpass masz spację :)
  • Poziom 13  
    ahhhh poprawione i działa! no to próbuje md5 uruchomić,

    mysql_real_escape_string(md5($userpass)) jak tak wstawiałem to błąd tej linijki zwracał.
  • Pomocny post
    Poziom 40  
    Odwrotnie: md5(mysql_real_escape_string($userpass)) - najpierw modyfikujesz tekst, potem robisz z niego md5. Zrób najlepiej echo i zobacz czy dobrze hasło koduje (i czy takie samo jest w bazie). Chociaż tak jak masz teraz też powinno działać, upewnij się że znowu jakiegoś babola nie zrobiłeś :)
    PS. Pisz konkretnie, jakie błędy czy komunikaty zwraca.
  • Poziom 13  
    Parse error: syntax error, unexpected ';'

    tak i tak zwaca ten sam błąd :|

    jak usunę " ; " to błąd przechodzi na linijkę niżej

    $result = mysql_query($query)


    Parse error: syntax error, unexpected T_VARIABLE
  • Poziom 40  
    No to tłumaczymy komunikaty, tłumaczymy ... Wcisnąłeś gdzieś o jeden średnik za dużo - powinna być podana linijka której to dotyczy. Jak nie znajdziesz wklej kod raz jeszcze albo edytuj posta bo teraz tego nie widać.
  • Poziom 13  
    to chyba nie o średnik chodzi albo mi na oczy padło
  • Pomocny post
    Poziom 40  
    A policz dobrze ilość nawiasów otwierających i zamykających w całym wyrażeniu $query... najlepiej jutro rano, bo widzę że już późno i Kolega zmęczony... :]
  • Poziom 13  
    oj tak 12 h dziś w pracy i po pracy zasuwam jeszcze, ah tak zawziętość ;]
  • Poziom 13  
    Dzięki za wszystkie rady, wszystko działa jak powinno, wdrożyłem:

    Kod: php
    Zaloguj się, aby zobaczyć kod


    i przy wylogowaniu session_destroy();

    Dużo ten post mnie nowego nauczył.

    Może kolega miał styczność z wczytaniem z pola BLOB pliku .pdf do przeglądarki.
    Wiem, że łatwiej zapisywać w bazie tylko link do .pdf ale..to znowu niebezpieczne mi się wydaje, zarys jest taki, że będzie np. 200 użytkowników i każdy na swoim koncie będzie miał dodawane kilka plików pdf w ciągu roku. Wrzucenie to do jednego folderu wydaje mi się mało bezpieczne. Chyba żeby każdy user miał by swój folder jakoś zaszyfrowany ale to już chyba gruba robota.
  • Pomocny post
    Poziom 42  
    Wystarczy, że plik będzie udostępniany za pośrednictwem skryptu (po prostu w nim zrobisz readfile). Nie kładź tego do bazy, bo będzie mało wydajne, bardzo obciążające dla bazy i trudniej odzyskać dane w razie draki (z czasem na to potrzebnym włącznie).
  • Poziom 13  
    no właśnie nie sądze zeby było to mniej wydajne, to beda pliki max 0.3 mb wiec...wszystko raczej zależy od łącza klienta, a nie w jaki sposób plik będzie udostępniany.