Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Logowanie PHP PDO
seba199696
post
Post #1





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 4.01.2011

Ostrzeżenie: (20%)
X----


Cześć wszystkim smile.gif

Napisałem logowanie do serwisu i wszystko działa poprawnie lecz proszę o wasze sugestię na temat bezpieczeństwa skryptu. Proszę o wyrozumiałość smile.gif Pozdrawiam!

Daję kod:

  1. <?php
  2. ?>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4.  
  5. <form method="post" action="login.php">
  6. <input type="text" name="email"/>
  7. <input type="password" name="password"/>
  8. <input type="submit" name="submit"/>
  9. </form>
  10. <?php
  11. try
  12. {
  13. //conect
  14. $pdo = new PDO('mysql:host=localhost;dbname=user', 'user', '***');
  15. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  16.  
  17. if(isset($_POST['submit'])) {
  18.  
  19. if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
  20. {
  21.  
  22. $password = sha1($_POST['password'].'sad8%$9sdk');
  23.  
  24. $stmt = $pdo -> prepare('SELECT `email`, `password`,`id` FROM `users` WHERE `email` = :email AND `password` = :password');
  25.  
  26. $stmt -> bindValue(':email', $_POST['email'], PDO::PARAM_STR);
  27. $stmt -> bindValue(':password', $password, PDO::PARAM_STR);
  28. $stmt -> execute();
  29.  
  30. $count = $stmt ->rowCount();
  31.  
  32. if($count > 0) {
  33.  
  34. while($row = $stmt -> fetch())
  35. {
  36.  
  37. $_SESSION['status'] = true;
  38. $_SESSION['id'] = $row['id'];
  39. $_SESSION['HTTP_USER_AGENT'] = sha1($_SERVER['HTTP_USER_AGENT'].'dsd#$%^');
  40.  
  41. header('Location: home.php');
  42. }
  43.  
  44. } else {
  45.  
  46. echo "Logowanie zakończone niepowodzeniem!";
  47.  
  48. }
  49.  
  50. } else {
  51.  
  52. echo 'Adres e-mail niepoprawny';
  53.  
  54. }
  55.  
  56. }
  57. }
  58. catch(PDOException $e)
  59. {
  60. echo 'Error: ' . $e->getMessage();
  61. }
  62. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 17)
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Sprawdzaj jeszcze długość podanych danych i będzie mniej więcej ok.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
IceManSpy
post
Post #3





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


A nie lepiej zrobić połączenie dopiero po if(isset) ?


--------------------
Go to the top of the page
+Quote Post
zegarek84
post
Post #4





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(IceManSpy @ 15.11.2011, 01:01:45 ) *
A nie lepiej zrobić połączenie dopiero po if(isset) ?

jeśli chodzi o optymalizację to tak - ale na początek nie ma co przesadzać ;]


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
cycofiasz
post
Post #5





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

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


Tylko co tam na początku robi ten HTML? Przecież poniżej wysyłasz nagłówki.
Go to the top of the page
+Quote Post
seba199696
post
Post #6





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 4.01.2011

Ostrzeżenie: (20%)
X----


Chcę umieścić sprawdzenie poprawności hasła smile.gif

- jedną małą literę
- jedną dużą literę
- jedną cyfrę
- jeden znak specjalny
- min 8 znaków
- max 30 znaków

Podaję kod:

  1. <?php
  2.  
  3. $pass = "Password!1";
  4.  
  5. if (preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-]).{8,30}$/",$pass)) {
  6.  
  7. //true
  8.  
  9. }
  10.  
  11. ?>


Co o tym myślicie?

Ten post edytował seba199696 15.11.2011, 21:24:06
Go to the top of the page
+Quote Post
abort
post
Post #7





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


IMO Wygląda nieźle.
Go to the top of the page
+Quote Post
zegarek84
post
Post #8





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


jako, że rozumiem wyrażenia regularne, to mogę ze spokojnym sumieniem napisać, iż znaków można wprowadzić grubo więcej niż 30 a i poprawne hasło z założenia będzie błędne - przykład:
!0aAAAAA
z kolei błędne hasło które na bank przejdzie:
...............A...............a...............0...............!...............
na wyrażeniu całości tak nie zrobisz , i choć całe wyrażenie nie jest najlepsze to koniec choćby nawet znaczy .{8,30} - minimum 8 max 30 dowolnych znaków, z kolei ".*" znaczy to samo co 0 i więcej dowolnego znaku...

ps. nie wierzę, że hasło w podanym kodzie pasuje do wzorca ;D - gdyż nie może
______________________

edit
mój błąd

Ten post edytował zegarek84 16.11.2011, 21:58:19


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
seba199696
post
Post #9





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 4.01.2011

Ostrzeżenie: (20%)
X----


Napisałeś że haslo ...............A...............a...............0...............!............... przejdzie a to nie prawda pokazuje false
Go to the top of the page
+Quote Post
abort
post
Post #10





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


Cytat(zegarek84 @ 16.11.2011, 00:44:35 ) *
ps. nie wierzę, że hasło w podanym kodzie pasuje do wzorca ;D - gdyż nie może


A jednak pasuje. Wystarczy wrzucić regexpa do pliku php i odpalić go w przeglądarce, co serdecznie polecam.
Pasuje także zmiana kolejności liter, cyfr i znaków specjalnych (czego na pierwszy rzut oka nie widziałem).
Go to the top of the page
+Quote Post
zegarek84
post
Post #11





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


rzeczywiście mój błąd - aż mi wstyd - nie trzeba wrzucać do pliku, można z linii poleceń sprawdzić...

chyba przegapiłem znak "=" i potraktowałem jako ":", czyli zamiast (?=) myślałem w kategorii (?:)... jest jeszcze jedno przydatne grupowanie (?!) - czyli ma się nie dopasować do tego co w środku...

Ten post edytował zegarek84 16.11.2011, 21:59:18


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
seba199696
post
Post #12





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 4.01.2011

Ostrzeżenie: (20%)
X----


Wkleję za niedługo poprawiony skrypt smile.gif

  1. <?PHP
  2. if(isset($_POST['submit'])) {
  3.  
  4. if (preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-]).{8,30}$/",$_POST['password'])) {
  5.  
  6. if(preg_match('/^[a-zA-Z\.\-\_]+\@[a-zA-Z0-9\.\-\_]+\.[a-z]{2,4}$/D', $_POST['email'])) {
  7.  
  8. try
  9. {
  10. $pdo = new PDO('mysql:host=localhost;dbname=user', 'user', '***');
  11. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  12.  
  13. $password = sha1($_POST['password'].'sad8%$9sdk');
  14.  
  15. $stmt = $pdo -> prepare('SELECT `email`, `password`,`id` FROM `users` WHERE `email` = :email AND `password` = :password');
  16.  
  17. $stmt -> bindValue(':email', $_POST['email'], PDO::PARAM_STR);
  18. $stmt -> bindValue(':password', $password, PDO::PARAM_STR);
  19. $stmt -> execute();
  20.  
  21. $count = $stmt ->rowCount();
  22.  
  23. if($count > 0) {
  24.  
  25. while($row = $stmt -> fetch())
  26. {
  27.  
  28. $_SESSION['status'] = true;
  29. $_SESSION['id'] = $row['id'];
  30. $_SESSION['HTTP_USER_AGENT'] = sha1($_SERVER['HTTP_USER_AGENT'].'dsd#$%^');
  31.  
  32. // last active the user ip
  33. $stmt = $pdo -> prepare('UPDATE `users` SET `ip` = :ip WHERE `id` = :id');
  34.  
  35. $stmt -> bindValue(':ip', $_SERVER['REMOTE_ADDR'], PDO::PARAM_STR);
  36. $stmt -> bindValue(':id', $row['id'], PDO::PARAM_STR);
  37.  
  38. $stmt -> execute();
  39. //
  40.  
  41. header('Location: index.php');
  42. }
  43.  
  44. }
  45. }
  46.  
  47. catch(PDOException $e)
  48. {
  49. echo 'Error: ' . $e->getMessage();
  50. }
  51. } else { echo "Email error"; }
  52. } else { echo "Hasło error"; }
  53. } else { echo "Formularz error"; }
  54.  
  55. ?>
  56.  


Ten post edytował seba199696 16.11.2011, 23:02:52
Go to the top of the page
+Quote Post
Crozin
post
Post #13





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

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


1. Po co w procesie logowania sprawdzasz poprawność formatu emaila / hasła?
2. Po nagłówku Location powinieneś przerwać działanie skryptu i wyświetlić stronę z informacją o wykonaniu przekierowania do innego URL.
3. Zamiast paskudnych, zagnieżdżonych IF-ELSE-ów, możesz napisać:
  1. if (!...) {
  2.  
  3. }
  4.  
  5. if (!...) {
  6.  
  7. }
  8.  
  9. // tutaj kod, gdy wszystko w porządku


Go to the top of the page
+Quote Post
seba199696
post
Post #14





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 4.01.2011

Ostrzeżenie: (20%)
X----


Poprawiłem to smile.gif

Wydaje mi się że wszystko jest okej smile.gif

  1. <?php
  2.  
  3. $password = $_POST['password'];
  4. $email = $_POST['email'];
  5.  
  6.  
  7. function checkout_password($password)
  8. {
  9. if(preg_match("/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+|-]).{8,30}$/",$password))
  10. return true;
  11. else
  12. return false;
  13. }
  14.  
  15. function checkout_email($email)
  16. {
  17. if(preg_match('/^[a-zA-Z\.\-\_]+\@[a-zA-Z0-9\.\-\_]+\.[a-z]{2,4}$/D', $email))
  18. return true;
  19. else
  20. return false;
  21. }
  22.  
  23.  
  24. if (checkout_email($email) and checkout_password($password) and isset($_POST['submit']))
  25. {
  26. try
  27. {
  28.  
  29. $pdo = new PDO('mysql:host=localhost;dbname=user', 'user', 'password');
  30. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  31.  
  32. $passwordhash = sha1($password.'sad8%$9sdk');
  33.  
  34. $stmt = $pdo -> prepare('SELECT `email`, `password`,`id` FROM `users` WHERE `email` = :email AND `password` = :password');
  35. $stmt -> bindValue(':email', $email, PDO::PARAM_STR);
  36. $stmt -> bindValue(':password', $passwordhash, PDO::PARAM_STR);
  37. $stmt -> execute();
  38.  
  39. $count = $stmt ->rowCount();
  40.  
  41. if($count > 0)
  42. {
  43.  
  44. while($row = $stmt -> fetch())
  45. {
  46.  
  47. $_SESSION['status'] = true;
  48. $_SESSION['id'] = $row['id'];
  49. $_SESSION['HTTP_USER_AGENT'] = sha1($_SERVER['HTTP_USER_AGENT'].'dsd#$%^');
  50.  
  51.  
  52. header('Location: index.php');
  53. }
  54.  
  55. }
  56.  
  57. }
  58.  
  59. catch(PDOException $e)
  60. {
  61. echo 'Error: ' . $e->getMessage();
  62. }
  63.  
  64. } else {
  65.  
  66. header('Location: login.html');
  67.  
  68. }
  69.  
  70.  
  71.  
  72. ?>


Ten post edytował seba199696 17.11.2011, 22:23:48
Go to the top of the page
+Quote Post
cycofiasz
post
Post #15





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

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


Po co pętla while? Nie sądzę by było więcej userów o tym samym emailu i haśle.
Podczas pisania polecam pracować z wyświetlaniem błędów typu E_NOTICE.
Go to the top of the page
+Quote Post
seba199696
post
Post #16





Grupa: Zarejestrowani
Postów: 119
Pomógł: 0
Dołączył: 4.01.2011

Ostrzeżenie: (20%)
X----


Czyli zamiast:

  1. while($row = $stmt -> fetch())

Użyć:
  1. $row = $stmt -> fetch();

?

Ten post edytował seba199696 17.11.2011, 22:20:54
Go to the top of the page
+Quote Post
Inscure
post
Post #17





Grupa: Zarejestrowani
Postów: 61
Pomógł: 4
Dołączył: 18.09.2010

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


Tak


--------------------
eXtreme-Fusion CMS - polski, darmowy system zarządzania treścią z rozbudowanym wsparciem technicznym.
Go to the top of the page
+Quote Post
celbarowicz
post
Post #18





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


Podobno : $stmt -> closeCursor();
http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO
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 Aktualny czas: 21.08.2025 - 05:52