Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: czy takie sposób jest dobry?
Forum PHP.pl > Forum > PHP
john_doe
Witajcie,
napisałem dziś logowanie. Napiszcie czy jest ok? Ogólnie działa ale, że działa to nie wszystko. Co byście zmienili? Co robię źle i bez sensu? czy idea jest oki? Czy idzie ten kod jakoś obejść i wejść mimo logowania na stronę?

poniżej kod z komentarzem

  1. <?php
  2.        
  3.    include ('db/conection.php');  // łącze się z db za pomocą PDO
  4.    
  5.    include('querries/confQuerries.php');  // tutaj plik z zapytaniami SQL
  6.    
  7.    
  8.    $howMany = $dbh -> query($COUNT_LOGIN_USERS);     // tutaj zapytanie count(*) where $_POST['login']
  9.        
  10.    foreach( $howMany as $k )
  11.    {
  12.    
  13.        $count = $k[0];
  14.    
  15.    }
  16.    
  17.    
  18.    if ( $count == 1 )  // jeśli zapytanie zwróciło jeden wiersz
  19.    {
  20.                foreach ( $dbh -> query( $SELECT_USER ) as $row ) // wybieram wszystkie dane usera where $_POST['login']
  21.                {
  22.                    if ( $_POST['login'] == $row[1] && $_POST['pass'] == $row[2] )  // jeśli wpisany login odpowiada loginowi w bazie i wpisane haslo odpowiada temu z bazy przypisuje wynik zapytania do sesji
  23.                    {
  24.                        $_SESSION['id']       = $row[0];
  25.                        $_SESSION['login']    = $row[1];
  26.                        $_SESSION['pass']     = $row[2];
  27.                        $_SESSION['name']     = $row[3];
  28.                        $_SESSION['surname']  = $row[4];
  29.                        $_SESSION['nickname'] = $row[5];
  30.                        $_SESSION['level']    = $row[6];
  31.                        $_SESSION['xlid']     = $row[7];
  32.                        $_SESSION['region']   = $row[8];
  33.                        $_SESSION['logIn']    = 1;
  34.                        
  35.                        $output = getdate();
  36.                        
  37.                        $loginAim = $output[year] . '-' . $output[mon] . '-' . $output[mday] . ', ' . $output[hours] . ':' . $output[minutes] . ':' . $output[seconds];
  38.                        
  39.                        include('querries/confQuerries.php');
  40.                        
  41.                        if ( $_SESSION['xlid'] != 5555555 ) // nie loguje ADMINA
  42.                        {
  43.                            $dbh -> query( $INSERT_LOGGED_USER ); // log kto i kiedy sie zalogował
  44.                                
  45.                            foreach( $dbh -> query( $SELECT_LAST_INSERT_ID_PER_USER ) as $row )
  46.                            {
  47.                                $_SESSION['sessionIdLogger'] = $row[0];
  48.                            }
  49.        
  50.                        }    
  51.                            
  52.                        header( 'Location: http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/') . '/' . mainView.'.'.php ); // jesli wszystko ok to kieruje na stronę jakąś tam dostępną po zalogowaniu poprawnym
  53.                        exit;
  54.                    }else
  55.                        {
  56.                            header( 'Location: http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/') . '/' . index.'.'.php ); // jeśli coś nie tak to kieruje na stronę logowania
  57.                            exit;
  58.                        }
  59.                    
  60.                }
  61.    
  62.    }else header( 'Location: http://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/') . '/' . index.'..php );
  63.    
  64.    
  65. ?>
no-scared
Cytat
tutaj zapytanie count(*) where $_POST['login']


mozesz dac cale to zapytanie winksmiley.jpg?
john_doe
  1. <?php
  2. $COUNT_LOGIN_USERS = '
  3.            SELECT COUNT(*)
  4.                FROM dbo.kcusers
  5.              WHERE user_login = '."'". $_POST['login']."'";
  6.        
  7.  
  8.  
  9. $SELECT_USER = '
  10.            SELECT user_id, user_login, user_pass, user_name, user_surname, user_nickname, user_level, user_xlid, user_region
  11.                FROM dbo.kcusers
  12.            WHERE user_login = '."'". $_POST['login']."'";
  13. ?>
pyro
Podatne na SQL Injection. Możliwość obejścia logowania bez znajomosci danych
bim2
  1. <?php
  2. $dbh -> query( $SELECT_USER )
  3. ?>

Jak już posiadasz jakąś klasę to zrób może getRow()? Który zwróci arraya jako jeden wynik $wynik['kolumna'] smile.gif
john_doe
pyro jak taki skrypt można obejść możesz napisać. jakiś przykład? to ważny fundament każdej aplikacji

gdy wpiszę np w pole login or 1=1 i hasło blablabla nic się nie dzieje
bim2
wpisz
Cytat
' OR '1'='1
Fifi209
od czego masz prepare, bindValue, bindParam ?

winksmiley.jpg

Poczytaj w manualu
Crozin
Po co najpierw pobierasz ilość rekordów dla login = xxx, a dopiero potem dane dla login = xxx? Odrazu pobierz wszystkie dane - jak nic nie zwrócić, to znaczy, że takiego użytkownika nie ma.
Weź sobie utwórz jakąś stałą, która będzie zawierała adres strony czy coś takiego, bo każdorazowe klepanie w header() tego, to jakaś masakra. Dodatkowo dobrze by było, żebyś po header() dodał:
  1. <?php
  2. die('Przekierowanie na adres: TUTAJ ADRES JAKO LINK');
  3. ?>
Obiekt spod $dbh mógłby obsługiwać metody getRows() - zwraca wiele rekodrów, getRow() - zwraca jeden, getField() - zwraca pierwszą kolumnę z pierwszego rekordu. Albo lepiej przejdź na PDO.
Brak filtracji danych.
Nie stosuj numerycznych indeksów w tablicy zwracanej przez bazę danych. Raz, że jest to kompletnie niezrozumiałe, dwa, że w przypadku zmiany kolejności kolumn w bazie skrypt się sypie.
Chyba łatwiej będzie:
  1. <?php
  2. $loginAim = date('Y-m-d H:i:s');
  3. ?>
john_doe
wpisałem w pole login ' OR '1'='1 a w pole haslo -- by zakometować resztę zapytania

i dostałem komunikat


Warning: Invalid argument supplied for foreach() in C:\wamp\www\..........................php on line 11

Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\www\...........................................php:11) in C:\wamp\www\.........................php on line 63

czy wystarczy gdy w zapytaniu SQL dodam przed $_POST htmlspecialchars lub mysql_real_escape_string questionmark.gif
w 1szej kolejności chcę ustrzec się przed SQL Injection.

dzięki za odpowiedzi. Otwieracie mi oczy <gitara>

i jeszcze jedno jak w takim razie zapakować wynik zapytania do sesji skoro robię to jak chłopu na wsi?
erix
Cytat
dzięki za odpowiedzi. Otwieracie mi oczy <gitara>

A widziałeś czasem przyklejone wątki?

Cytat
i jeszcze jedno jak w takim razie zapakować wynik zapytania do sesji skoro robię to jak chłopu na wsi?

Wyciągasz tablicę i wpychasz do sesji - nie pakuj do niej bezpośrednio zasobu wyniku.
Fifi209
Cytat(Crozin @ 26.05.2009, 21:13:13 ) *
Obiekt spod $dbh mógłby obsługiwać metody getRows() - zwraca wiele rekodrów, getRow() - zwraca jeden, getField() - zwraca pierwszą kolumnę z pierwszego rekordu. Albo lepiej przejdź na PDO.
Brak filtracji danych.


Przecież pisał, że PDO używa. Co do filtracji ja już o tym pisałem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.