Pokaż wyniki 1 do 9 z 9

Temat: sql injection w jaki sposób?

  1. #1

    Domyślnie sql injection w jaki sposób?

    Hej.
    Zabezpieczam sobie skrypt logowania przed sql injection wydaje mi się że już powinien być dobry.Więc pytam was koledzy w jaki sposób można złamać (zalogować się) ten skrypt
    Pierwsze zabezpieczenie to htmlspecialchars
    drugie zabezpieczenie to czy zmienna $pass równa się $password if($pass == $row['password']){

    byłbym wdzięczny za przykładowe zapytania SQLI
    Ostatnio edytowane przez inkom : 05-06-2014 - 16:38

  2. #2

    Domyślnie

    Po pierwsze, mysql_real_escape_string() będzie tu lepsze od htmlspecialchars() jeśli nie bezpieczeńsze to przynajmniej czytelniejsze/poprawniejsze/adekwatniejsze.

    Po drugie, nie ma sensu wrzucać hasła do zapytania a potem jeszcze raz sprawdzać czy jest identyczne, jeśli wynik nie bezie pusty, to oznacza że jest identyczne (duh).

    Po trzecie, całym tym bałaganem zajmuje się (za mnie) query-builder.
    Kod php:
    <?php

    $user 
    $_REQUEST['user'];
    $pass $_REQUEST['pass'];

    $result $db
        
    ->where('login'$user)
        ->
    where('password'$pass)
        ->
    limit(1)
        ->
    get('uzy')
        ->
    row_array();
    if ( 
    $result ){
        
    $_SESSION['id'] = $result['ID'];
    }
    Po czwarte.
    Garstka uwag do stylu Twojeg kodu:
    1. Niepotrzebne nadpisujesz zmienne środowiskowe, zostaw je nienaruszone na specjalne okazje (np. zapisanie wszystkich zmiennych $_POST do pliku w celu debugowania).
    2. Staraj się aby Twój kod nie ciągnał się w prawo tylko w dół. Taki kod łatwiej się czyta, bo tylko wbijasz wzrok w tuż przy lewej krawędzi ekranu i scrollujesz.
    Dodatkowo taki kod dużo prościej się debubuje, bo jeśli np. tworzenie jakiegoś stringa składa sięz kilku etapów, to mając to podzielone na kilka wierszy możesz łatwo zatrzymać przetwarzanie w podejrzanym miejscu i wydrukować aktualną zawartośc strinka bez konieczności modyfikowania kodu.
    Przykład:

    Kod php:
    <?php

    $login 
    $_POST['login'];
    $login htmlspecialchars($login);
    $passw '';
    $passw .= $_POST['password'];
    $passw .= $_POST['login'];
    $passw .= md5($_POST['password']);
    // print_r($passw);exit;
    $passw sha1($passw);
    Ostatnio edytowane przez lame2 : 04-12-2014 - 16:26
    Głos racjonalny.

  3. #3

    Domyślnie

    Cytat Napisał lame2 Zobacz post
    Po pierwsze, mysql_real_escape_string() będzie tu lepsze od htmlspecialchars() jeśli nie bezpieczeńsze to przynajmniej czytelniejsze/poprawniejsze/adekwatniejsze.

    Po drugie, nie ma sensu wrzucać hasła do zapytania a potem jeszcze raz sprawdzać czy jest identyczne, jeśli wynik nie bezie pusty, to oznacza że jest identyczne (duh).

    Po trzecie, całym tym bałaganem zajmuje się (za mnie) query-builder.
    Kod php:
    <?php

    $user 
    $_REQUEST['user'];
    $pass $_REQUEST['pass'];

    $result $db
        
    ->where('login'$user)
        ->
    where('password'$pass)
        ->
    limit(1)
        ->
    get('uzy')
        ->
    row_array();
    if ( 
    $result ){
        
    $_SESSION['id'] = $result['ID'];
    }
    Po czwarte.
    Garstka uwag do stylu Twojeg kodu:
    1. Niepotrzebne nadpisujesz zmienne środowiskowe, zostaw je nienaruszone na specjalne okazje (np. zapisanie wszystkich zmiennych $_POST do pliku w celu debugowania).
    2. Staraj się aby Twój kod nie ciągnał się w prawo tylko w dół. Taki kod łatwiej się czyta, bo tylko wbijasz wzrok w tuż przy lewej krawędzi ekranu i scrollujesz.
    Dodatkowo taki kod dużo prościej się debubuje, bo jeśli np. tworzenie jakiegoś stringa składa sięz kilku etapów, to mając to podzielone na kilka wierszy możesz łatwo zatrzymać przetwarzanie w podejrzanym miejscu i wydrukować aktualną zawartośc strinka bez konieczności modyfikowania kodu.
    Przykład:

    Kod php:
    <?php

    $login 
    $_POST['login'];
    $login htmlspecialchars($login);
    $passw '';
    $passw .= $_POST['password'];
    $passw .= $_POST['login'];
    $passw .= md5($_POST['password']);
    // print_r($passw);exit;
    $passw sha1($passw);
    Do czego ty mnie namawiasz?
    Proste pytanie a ty sobie nabijasz ilość postów pisząc bzdury i nie na temat.
    1. mysql_real_escape_string() już obszedłem to zabezpieczenie więc na pewno nie bezpieczniejsze.
    2."Lamerze" piszący na forum o bezpieczeństwie- ty nie masz zielonego pojęcia o SQL injection!!!, wpisując w login odpowiedni ciąg znaków zakończony # lub -- pomijasz sprawdzanie w bazie danych hasła!!! dlatego sprawdzam czy wpisane przez użytkownika hasło zgadza się z tym w bazie danych.
    3.Nie namawiaj ludzi do pisania w spaghetti code, w kodzie ma być porządek i ma być czytelny jak napiszesz program który ma powiedzmy 15000 linijek poprawnego kodu to zobaczysz jaka jest różnica
    4. błagam cie nie odpisuj daj szanse ludziom mającym pojecie o tym co piszą.

  4. #4
    Zarejestrowany
    Nov 2006
    Skąd
    Polska/Poland
    Postów
    1,191

    Domyślnie

    Z punktu widzenia administratora dodałbym L7 filter.
    ***********
    * markossx *
    ***********

  5. #5

    Domyślnie

    Cytat Napisał inkom Zobacz post
    Do czego ty mnie namawiasz?
    Proste pytanie a ty sobie nabijasz ilość postów pisząc bzdury i nie na temat.
    1. mysql_real_escape_string() już obszedłem to zabezpieczenie więc na pewno nie bezpieczniejsze.
    2."Lamerze" piszący na forum o bezpieczeństwie- ty nie masz zielonego pojęcia o SQL injection!!!, wpisując w login odpowiedni ciąg znaków zakończony # lub -- pomijasz sprawdzanie w bazie danych hasła!!! dlatego sprawdzam czy wpisane przez użytkownika hasło zgadza się z tym w bazie danych.
    3.Nie namawiaj ludzi do pisania w spaghetti code, w kodzie ma być porządek i ma być czytelny jak napiszesz program który ma powiedzmy 15000 linijek poprawnego kodu to zobaczysz jaka jest różnica
    4. błagam cie nie odpisuj daj szanse ludziom mającym pojecie o tym co piszą.
    1. Obszedłeś mysql_real_escape_string() ? Jestem bardzo ciekaw jak. Napisz o tym.
    2. Moim zdaniem do dupy podejście.. Trzeba upewnić się że zapytanie jest OK, a nie tworzyć logikę, która tylko zwiększ szansę na uratowanie sytuacji. Zresztą to tylko gadanie, bo w praktyce przed niczym nie zabezpiecza (dead-code).
    3. Namawiam usilnie! Spaghetti w dół jest OK Chce widzieć więcej takiego kodu, posłuchaj co mówi Crockford.

    Skoro jesteś niereformowalny, to podam dwa rozwiązania, jedno praktyczne, drugie pewne.

    Praktyczne:
    Użyj query-builder'a, on zabezpieczy przed wszystkim atakami sql jection (przynajmnije z założenia),
    jeśli znajdziesz buga, odpal ticketa, ew zaproponuj fixa. Tak się dzisiaj robi sajty.
    Każde inne podejście to objaw choroby, bo przecież całe to bezpieczeństwo sprowadza się do implementacji kolejnych etapów filtracji które w gruncie rzeczy zabezpieczają przed konkretnym atakami lub przed klasą ataków...
    Tą kolosalną pracę już odwalono przy okazji dziesiątek projektów na githubie.
    O czym my rozmawiamy...

    Pewne:
    Zrób testy na wszystkich permutacjach: danych wejściowych, wersji i konfiguracji systemu operacyjnego, wersji i konfiguracji apacha, wersji i konfiguracji php oraz wersji i konfiguracji mysql.
    Jeśli chcesz mogę pomóc postawić taką test-platformę ale to będzie bardzo drogo kosztować
    Ostatnio edytowane przez lame2 : 05-05-2014 - 10:25
    Głos racjonalny.

  6. #6
    Zarejestrowany
    Mar 2013
    Skąd
    ../../../../../../../../../../
    Postów
    17

    Domyślnie

    Jeśli chodzi o filtrowanie, zawsze piszę sobie jakąś prościutką funkcje, dla przykładu czysc()..


    Kod php:
    function czysc($text) {
         
    $text mysql_real_escape_string($text);
         
    $text trim($text);
         
    $text htmlspecialchars($text);
         return 
    $text;

    Bo po co kłócić się pomiędzy htmlspecialchars() a mysql_real_escape_string(), skoro można wrzucić obie?

  7. #7

    Domyślnie

    Cytat Napisał SMG.cpp Zobacz post
    Jeśli chodzi o filtrowanie, zawsze piszę sobie jakąś prościutką funkcje, dla przykładu czysc()..
    Też tak robiłem z 5 lat temu, aż się połapałem, że tworzenie podobnych funkcji robi totalną masakrę z kosztem utrzymania kodu. Z całą stanowczością odradzam takie podejście, gdyż jest ono koszmarne w skutkach.

    Cytat Napisał SMG.cpp Zobacz post
    Bo po co kłócić się pomiędzy htmlspecialchars() a mysql_real_escape_string(), skoro można wrzucić obie?
    Świetna rada! Chyba spróbuje przeszczepić Twoje rozumowanie poza IT, zacznę od zakładania różnych skarpetek, po co się męczyć z wyborem, lepiej założyć po jednej parze na każdą stopę... A gdyby spodoba mi się trzecia i czwarta para, założę je na dłonie, a gdyby w oko wpadła mi piąta para, szybkim ruchem wciągnę ją na c***a
    Ostatnio edytowane przez lame2 : 05-14-2014 - 08:54
    Głos racjonalny.

  8. #8
    Zarejestrowany
    Mar 2013
    Skąd
    ../../../../../../../../../../
    Postów
    17

    Domyślnie

    Cytat Napisał lame2 Zobacz post
    Też tak robiłem z 5 lat temu, aż się połapałem, że tworzenie podobnych funkcji robi totalną masakrę z kosztem utrzymania kodu. Z całą stanowczością odradzam takie podejście, gdyż jest ono koszmarne w skutkach.


    Świetna rada! Chyba spróbuje przeszczepić Twoje rozumowanie poza IT, zacznę od zakładania różnych skarpetek, po co się męczyć z wyborem, lepiej założyć po jednej parze na każdą stopę... A gdyby spodoba mi się trzecia i czwarta para, założę je na dłonie, a gdyby w oko wpadła mi piąta para, szybkim ruchem wciągnę ją na c***a
    Nie no, zajebiście, lepiej wybrać jedną skarpetkę i drugą stopę mieć gołą.

  9. #9

    Domyślnie

    Ja osobiscie bym uzyl PDO ustawil charset na utf8 i uzyl bind_param pozniej prepare i execute.
    I wszystko byloby pieknie.
    Na mysql_real_escape_string trzeba troszke bardziej uwazac.

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj