Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] OOP PDO wyszukiwanie w bazie, jw
miras
post
Post #1





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


Witam, mam pewną klasę w niej obiekt pdo (uprzedzając podpowiedzi:)) i pewną funkcję, która odpowiada za sprawdzanie czy w bazie istnieje dany user czy nie jednak coś nie śmiga...



  1. public function login($login, $password) {
  2. $this->login = $login;
  3. $this->password = $password;
  4. $this->check_data = $this->pdo -> query("SELECT mail, haslo FROM users WHERE `mail`='$this->login' AND `haslo`='$this->password'");
  5. if (!empty($this->check_data)) {
  6. return "wszystko ok";
  7. }
  8. }


jak to "usprawnić" ?

Dzięki z góry!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Wybierasz dane które już posiadasz więc bez sensu. Zrób Select count(*) where... limit 1 przy założeniu że email posiada ograniczenie unique.
Czytałeś o prepared statements od ostatniego posta, prawda?
Go to the top of the page
+Quote Post
piotr.pasich
post
Post #3





Grupa: Zarejestrowani
Postów: 27
Pomógł: 4
Dołączył: 27.01.2012
Skąd: Gliwice

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


Przede wszystkim PDO jest po to, żeby uniknąć czystych zapytań MySQL, czyli powinno być coś w stylu:

$this->check_data = $this->pdo->select('users')
->fields(array('mail', 'haslo'))
->andWhere('mail = ?', $this->login)
->andWhere('haslo = ?', $this->password);

W ten sposób uzyskujesz minimum bezpieczeństwa. W swoim skrypcie masz bardzo poważny problem z SQJ injection.

Dodatkowo nie powinieneś mieć $this->login i $this->password tylko przekazać np obiekt usera i mieć $user->login i $user->password . Byłoby super gdyby było to pobierane przez metody np. $user->getLogin(), oraz $user->getPassword(). Przy czym password pamiętaj, że powinno być szyfrowane, czyli po zbindowaniu z formularza logowania ustawiasz najlepiej plainPasswod, które jest później konwertowane.

Za dużo w ogole operujesz na properiesach. Nie musisz ustawiac wszystkiego jako nowe pola w klasie. To bez sensu. Metoda ma zwócić tylko informację czy użytkownik może się zalogować czy nie. Przy czym return "wszystko ok"; raczej odpada. Daj return !empty($this->check_data) - zwróci true, albo false. Pomijasz wtedy w ogóle ifa.

Dodatkowo z tego co widzę to metoda nazywa się login.. przy czym nie loguje użytkownika tylko sprawdza czy istnieje w bazie danych. Powinna się nazywać zupełnie inaczej np. userExists($login, $password) i być wywoływaną przez login gdzie będzie ustawiana sesja.

Trochę chaotycznie, ale zawsze (IMG:style_emoticons/default/smile.gif)

Najlepiej wrzuć na githuba (IMG:style_emoticons/default/smile.gif)

Zapraszam też do głosowania na agendę http://www.phpcon.pl/2013/pl/agenda (IMG:style_emoticons/default/smile.gif)

Piotr Pasich

Ten post edytował piotr.pasich 7.08.2013, 20:10:22
Go to the top of the page
+Quote Post
miras
post
Post #4





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


ok, wszystko jasne, dzięki za tak wyczerpującą odpowiedź, mam tylko pytanko, bo tego nie mogę znaleźć - jak przekazać obiekt $user ?


i mam błąd:
  1.  
  2. Fatal error: Call to undefined method PDO::select() in rb.class.php on line 59




  1. public function login($login, $password) {
  2. $this->login = $login;
  3. $this->password = $password;
  4. $this->check_data = $this->pdo->select('users')->fields(array('mail', 'haslo'))->andWhere('mail = ?', $this->login)->andWhere('haslo = ?', $this->password);
  5. return !empty($this->check_data);
  6. }


Ten post edytował miras 9.08.2013, 11:42:15
Go to the top of the page
+Quote Post
Tajgeer
post
Post #5





Grupa: Zarejestrowani
Postów: 290
Pomógł: 48
Dołączył: 11.05.2008
Skąd: Kielce

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


http://php.net/manual/en/book.pdo.php

Po prostu PDO nie zawiera takich metod o jakich wspomniał kolega powyżej...

Jeśli chodzi o zabezpieczenie skryptu, skorzystaj z dobrodziejstw jakie oferuje PDO - bindowanie (bindParam, bindValue) oraz tzw. "prepared statements" o których wspomniał już viking (KLIK).

Pamiętaj, manual jest Twoim przyjacielem (IMG:style_emoticons/default/smile.gif) Jeśli chcesz więcej wskazówek, zamieść zawartość całej swojej klasy, w której jest funkcja login.

Ten post edytował Tajgeer 9.08.2013, 14:05:33
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 16:03