Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> czy takie sposób jest dobry?
john_doe
post 26.05.2009, 14:45:04
Post #1





Grupa: Zarejestrowani
Postów: 873
Pomógł: 25
Dołączył: 24.07.2005

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
no-scared
post 26.05.2009, 14:47:12
Post #2





Grupa: Zarejestrowani
Postów: 112
Pomógł: 0
Dołączył: 24.04.2008

Ostrzeżenie: (0%)
-----


Cytat
tutaj zapytanie count(*) where $_POST['login']


mozesz dac cale to zapytanie winksmiley.jpg?
Go to the top of the page
+Quote Post
john_doe
post 26.05.2009, 14:49:49
Post #3





Grupa: Zarejestrowani
Postów: 873
Pomógł: 25
Dołączył: 24.07.2005

Ostrzeżenie: (0%)
-----


  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. ?>


Ten post edytował john_doe 26.05.2009, 14:52:25
Go to the top of the page
+Quote Post
pyro
post 26.05.2009, 14:59:33
Post #4





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Podatne na SQL Injection. Możliwość obejścia logowania bez znajomosci danych


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
bim2
post 26.05.2009, 15:00:31
Post #5





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


  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


--------------------
Go to the top of the page
+Quote Post
john_doe
post 26.05.2009, 15:06:29
Post #6





Grupa: Zarejestrowani
Postów: 873
Pomógł: 25
Dołączył: 24.07.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował john_doe 26.05.2009, 15:15:22
Go to the top of the page
+Quote Post
bim2
post 26.05.2009, 16:33:57
Post #7





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


wpisz
Cytat
' OR '1'='1


Ten post edytował bim2 26.05.2009, 16:34:17


--------------------
Go to the top of the page
+Quote Post
Fifi209
post 26.05.2009, 17:14:23
Post #8





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


od czego masz prepare, bindValue, bindParam ?

winksmiley.jpg

Poczytaj w manualu


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Crozin
post 26.05.2009, 20:13:13
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
john_doe
post 26.05.2009, 22:21:16
Post #10





Grupa: Zarejestrowani
Postów: 873
Pomógł: 25
Dołączył: 24.07.2005

Ostrzeżenie: (0%)
-----


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?

Ten post edytował john_doe 26.05.2009, 22:50:38
Go to the top of the page
+Quote Post
erix
post 26.05.2009, 22:59:33
Post #11





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Fifi209
post 27.05.2009, 06:18:51
Post #12





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


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.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.06.2025 - 09:19